Удаление десериализации 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?
Спасибо заранее!
Ответы
Ответ 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());