簡體   English   中英

使用Json.NET將JSON反序列化為對象

[英]Deserializing JSON into an object with Json.NET

我正在使用新的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:在JSON中找不到必需屬性'user_id'。

這是因為JSON對象是一個數組嗎? 如果是這樣,我如何將其反序列化為一個User對象?

提前致謝!

如果您不想創建包裝類,也可以通過以下方式訪問用戶:

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文檔中的此頁面

正如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<UserResults>(jr);
    Console.WriteLine(u.user.display_name);
}

此包裝器上將有未來的元數據屬性,例如響應時間戳,因此使用它並不是一個壞主意!

與@Alexandre Jasmin的答案類似,您可以使用中間JsonSerializer進行轉換,而不是使用.ToString()上的高級JsonConvert 不知道它是否更有效......

參考文獻:

例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM