使用Json.NET将JSON反序列化为对象
我正在使用新的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; } ... }
我得到以下exception:
Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需属性’user_id’。
这是因为JSON对象是一个数组吗? 如果是这样,我如何将其反序列化为一个User对象?
提前致谢!
正如Alexandre Jasmin在您的问题的评论中所说,生成的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(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.ToString());
有关详细信息,请参阅Json.NET文档中的此页面 。
与@Alexandre Jasmin的答案类似,您可以使用中间JsonSerializer转换而不是使用.ToString()
上的高级JsonConvert
。 不知道它是否更有效……
参考文献:
- 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());