Я играю немного с новым 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 является массивом? Если так, как я могу десериализовать его к одному Пользовательскому объекту?
Заранее спасибо!
Как сказал Александр Жасмин в комментариях к вашему вопросу, полученный 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);
}
В этой оболочке будут будущие свойства метаданных, например отметка времени ответа, так что использовать ее - неплохая идея!
Если вы не хотите создавать класс-оболочку, вы также можете получить доступ к пользователю следующим образом:
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 .