Десериализация JSON в объект с Json.NET

Я играю немного с новым StackOverflow API. К сожалению, мой 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 является массивом? Если так, как я могу десериализовать его к одному Пользовательскому объекту?

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

25
задан Igal Tabachnik 31 March 2010 в 18:15
поделиться

2 ответа

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

Чтобы обойти эту проблему, нужно указать класс оболочки:

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<UserResults>(jr);
    Console.WriteLine(u.user.display_name);
}

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

27
ответ дан 28 November 2019 в 18:11
поделиться

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

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

Подробнее см. на этой странице в документе Json.NET .

36
ответ дан 28 November 2019 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: