Удаление десериализации JSON в объект с помощью Json.NET

Я немного играю с новым API StackOverflow . К сожалению, мой JSON немного слаб, поэтому мне нужна помощь.

Я пытаюсь десериализовать этот JSON пользователя:

{"user":{ "user_id": 1, "user_type": "moderator", "creation_date": 1217514151, "display_name": "Jeff Atwood", ... "accept_rate": 100 }} 

в объект, который я украсил атрибутами JsonProperty :

 [JsonObject(MemberSerialization.OptIn)] public class User { [JsonProperty("user_id", Required = Required.Always)] public virtual long UserId { get; set; } [JsonProperty("display_name", Required = Required.Always)] public virtual string Name { get; set; } ... } 

Я получаю следующее исключение:

Newtonsoft.Json.JsonSerializationException: Обязательное свойство user_id не найдено в JSON.

Это потому, что объект JSON является массивом? Если да, как я могу десериализовать его на один объект User?

Заранее спасибо!

Как сказал Alexandre Jasmin в комментариях к вашему вопросу, в результате JSON имеет обертку вокруг фактического объекта User который вы пытаетесь десериализовать.

Обходной class будет иметь class оболочки:

 public class UserResults { public User user { get; set; } } 

Тогда десериализация будет работать:

 using (var sr = new StringReader(json)) using (var jr = new JsonTextReader(sr)) { var js = new JsonSerializer(); var u = js.Deserialize(jr); Console.WriteLine(u.user.display_name); } 

На этой оболочке будут отображаться будущие свойства метаданных, например метка ответа, поэтому неплохо использовать ее!

Если вы не хотите создавать class-оболочку, вы также можете получить доступ к Пользователю следующим образом:

 String jsonString = "{\"user\":{\"user_id\": 1, \"user_type\": \"moderat..."; JToken root = JObject.Parse(jsonString); JToken user = root["user"]; User deserializedUser = JsonConvert.DeserializeObject(user.ToString()); 

См. Эту страницу в документе Json.NET для получения дополнительной информации.

Как и ответ @Alexandre Jasmin, вы можете использовать посредника JsonSerializer для преобразования вместо использования JsonConvert высокого уровня в .ToString() . Не знаю, если это более эффективно …

Рекомендации:

Пример:

 var root = JObject.Parse(jsonString); var serializer = new JsonSerializer(); var expectedUserObject = serializer.Deserialize(root["user"].CreateReader()); 
  • ShouldSerialize * () vs * Условный шаблон условной сериализации
  • Почему java.util.Optional не является Serializable, как сериализовать объект с такими полями
  • Джерси + jackson JSON формат даты формат - как изменить формат или использовать пользовательские JacksonJsonProvider
  • Сериализация JSON массива с полиморфными объектами
  • Преобразование записей в последовательную форму данных для отправки по HTTP
  • Использование readObject / writeObject в сериализации
  • Использовать имя classа в качестве корневого ключа для сериализации JSON Jackson
  • Удаление десериализации полиморфных classов json без информации о типе с использованием json.net
  • Рекомендации по сериализации объектов в пользовательский строковый формат для использования в выходном файле
  • Как десериализовать объект JObject для .NET
  • Как настроить сериализацию списка объектов JAXB для JSON?
  • Давайте будем гением компьютера.