Подтвердить что ты не робот

Удаление десериализации 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?

Спасибо заранее!

4b9b3361

Ответ 1

Как сказал Александр Жасмин в комментариях к вашему вопросу, в результате 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);
}

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

Ответ 2

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

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.

Ответ 3

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

Литература:

Пример:

var root = JObject.Parse(jsonString);
var serializer = new JsonSerializer();
var expectedUserObject = serializer.Deserialize<User>(root["user"].CreateReader());