我正在尝试解析一个JSON响应,其中包含一些我不太熟悉的内容,也没有经常在野外看到过。
在其中一个JSON对象中,有一个动态命名的JSON对象。
在此示例中,名为"bugs"
的{{1}}内有一个JSON对象,它与错误编号相关。
"12345"
我很好奇的是:解析动态命名的JSON对象最有效的方法是什么?
给出一些JSON Utility工具,比如
他们会像上面那样采用JSON响应,并将其变为类似下面的类:
jsonutils
{
"bugs" : {
"12345" : {
"comments" : [
{
"id" : 1,
"text" : "Description 1"
},
{
"id" : 2,
"text" : "Description 2"
}
]
}
}
}
json2charp
public class Comment
{
public int id { get; set; }
public string text { get; set; }
}
public class 12345
{
public IList<Comment> comments { get; set; }
}
public class Bugs
{
public 12345 12345 { get; set; }
}
public class Root
{
public Bugs bugs { get; set; }
}
这个问题是它生成一个带有动态名称的public class Comment
{
public int id { get; set; }
public string text { get; set; }
}
public class __invalid_type__12345
{
public List<Comment> comments { get; set; }
}
public class Bugs
{
public __invalid_type__12345 __invalid_name__12345 { get; set; }
}
public class RootObject
{
public Bugs bugs { get; set; }
}
。因此,使用此API的其他标识符的后续查询将导致失败,因为名称不匹配,也不会生成class
,因为它将包含根据上面生成的示例的动态类名称。
虽然JSON是有效的,但这似乎是JSON的限制,这种格式是这样设置的。不幸的是我对这个JSON API没有任何控制权,所以我很好奇解决这个问题的最佳方法是什么?
答案 0 :(得分:4)
尝试Json.NET,可以作为Nuget包(Newtonsoft.Json)或http://www.newtonsoft.com/json使用。
Json.NET可以执行基于类的序列化/反序列化,如您所示。它还为Json的格式未知或在开发时未修复的情况提供了通用的JObject和JToken类。
这是从文件加载json对象的示例。
{{1}}
答案 1 :(得分:3)
Newtonsoft.Json JsonConvert可parse将Dictionary<String, Comments>
作为public class Comment
{
public int id { get; set; }
public string text { get; set; }
}
public class Comments
{
public List<Comment> comments { get; set; }
}
public class RootObject
{
public Dictionary<String, Comments> bugs { get; set; }
}
提供适当的模型类:
var json = "{\r\n \"bugs\" : {\r\n \"12345\" : {\r\n \"comments\" : [\r\n {\r\n \"id\" : 1,\r\n \"text\" : \"Description 1\"\r\n },\r\n {\r\n \"id\" : 2,\r\n \"text\" : \"Description 2\"\r\n }\r\n ]\r\n }\r\n }\r\n}";
Console.WriteLine(json);
var obj = JsonConvert.DeserializeObject<RootObject>(json);
Console.WriteLine(obj.bugs["12345"].comments.First().text);
可以通过以下方式查看:
<asp:DataList ID="DataList3" runat="server">
<ItemTemplate runat="server">
<div class="lv-item media">
<div class="lv-avatar pull-left">
<asp:Image ID="Image4" runat="server" ImageUrl='<%# Bind("Image") %>' />
</div>
<div class="media-body">
<div class="ms-item">
<span class="glyphicon glyphicon-triangle-left" style="color: #000000;"></span>
<asp:Label ID="Message" runat="server" Text='<%# Bind("Message") %>'></asp:Label>
</div>
<small class="ms-date"><span class="glyphicon glyphicon-time"></span>
<asp:Label ID="Date" runat="server" Text='<%# Bind("Time") %>'></asp:Label></small>
</div>
</div>
</ItemTemplate>
</asp:DataList>