【问题标题】:Deserializing JSON into an object with Json.NET使用 Json.NET 将 JSON 反序列化为对象
【发布时间】:2010-03-31 18:15:02
【问题描述】:

我正在玩一点新的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 对象是一个数组吗?如果是这样,我如何将其反序列化为一个 User 对象?

提前致谢!

【问题讨论】:

  • 这个 JSON 中有两个对象。外部对象有一个属性user,其中包含实际的用户对象。您是否在代码中考虑到这一点?我在这里也没有看到任何 JSON 数组。

标签: c# .net json serialization json.net


【解决方案1】:

如果您不想创建包装类,您也可以通过这种方式访问​​用户:

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());

详情请见this page in the Json.NET doc

【讨论】:

  • 谢谢!用于反序列化我的对象数组List&lt;User&gt; deserializedUsers = JsonConvert.DeserializeObject&lt;List&lt;User&gt;&gt;(users.ToString());
  • 谢谢!这导致我解决了我的问题
【解决方案2】:

正如 Alexandre Jasmin 在您的问题的 cmets 中所说,生成的 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);
}

这个包装器上会有未来的元数据属性,例如响应时间戳,所以使用它不是一个坏主意!

【讨论】:

  • 非常感谢 Jarrod 的解释和非常好的解决方案!
【解决方案3】:

与@Alexandre Jasmin 的answer 类似,您可以使用中间的JsonSerializer 进行转换,而不是在.ToString() 上使用高级JsonConvert。不知道它是否更有效......

参考资料:

示例:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多