Удаление десериализации 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
:
- Как можно полиморфная десериализация Json String с использованием Java и библиотеки Jackson?
- gwt - Использование списка в вызове RPC?
- В чем разница между привязкой лямбды и метода на уровне выполнения?
- Есть ли у .NET 4 встроенный сериализатор / десериализатор JSON?
- Как вы сериализуете объект на C ++?
[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?
Заранее спасибо!
- Может ли Json.NET сериализовать / десериализовать в / из streamа?
- JSON.Net Обнаружен собственный цикл привязки
- Сериализация нескольких свойств DateTime в одном classе с использованием разных форматов для каждого из них
- Сериализация classа, который содержит std :: string
- Невозможно десериализовать lambda
- Json.net сериализует определенное частное поле
- ТипNameHandling предостережение в Newtonsoft Json
- EF 4.1 - Code First - Ошибка серийной ссылки JSON
Как сказал 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()
. Не знаю, если это более эффективно …
Рекомендации:
- https://stackoverflow.com/a/9453198/1037948
- http://www.west-wind.com/weblog/posts/2012/Aug/30/Using-JSONNET-for-dynamic-JSON-parsing
Пример:
var root = JObject.Parse(jsonString); var serializer = new JsonSerializer(); var expectedUserObject = serializer.Deserialize(root["user"].CreateReader());