[英]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.