Iga*_*nik 25 .net c# serialization json json.net
我正在使用新的StackOverflow API.不幸的是,我的JSON有点弱,所以我需要一些帮助.
我正在尝试反序列化用户的这个JSON:
{"user":{
"user_id": 1,
"user_type": "moderator",
"creation_date": 1217514151,
"display_name": "Jeff Atwood",
...
"accept_rate": 100
}}
Run Code Online (Sandbox Code Playgroud)
进入我用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; }
...
}
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需属性'user_id'.
这是因为JSON对象是一个数组吗?如果是这样,我如何将其反序列化为一个User对象?
提前致谢!
Ale*_*min 36
如果您不想创建包装类,也可以通过以下方式访问用户:
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());
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅Json.NET文档中的此页面.
Jar*_*xon 27
正如Alexandre Jasmin在您的问题的评论中所说,生成的JSON包含了User您尝试反序列化的实际对象的包装.
解决方法是使用所述包装类:
public class UserResults
{
public User user { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后反序列化将起作用:
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);
}
Run Code Online (Sandbox Code Playgroud)
此包装器上将有未来的元数据属性,例如响应时间戳,因此使用它并不是一个坏主意!
类似@Alexandre茉莉的回答,您可以使用一个中介JsonSerializer转换,而不是使用高层次JsonConvert上.ToString().不知道它是否更有效......
参考文献:
例:
var root = JObject.Parse(jsonString);
var serializer = new JsonSerializer();
var expectedUserObject = serializer.Deserialize<User>(root["user"].CreateReader());
Run Code Online (Sandbox Code Playgroud)