解析动态命名的JSON对象的最有效方法是什么?

时间:2017-01-09 19:39:24

标签: c# json

我正在尝试解析一个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没有任何控制权,所以我很好奇解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

尝试Json.NET,可以作为Nuget包(Newtonsoft.Json)或http://www.newtonsoft.com/json使用。

Json.NET可以执行基于类的序列化/反序列化,如您所示。它还为Json的格式未知或在开发时未修复的情况提供了通用的JObject和JToken类。

这是从文件加载json对象的示例。

{{1}}

答案 1 :(得分:3)

Newtonsoft.Json JsonConvertparseDictionary<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>&nbsp;
                    <asp:Label ID="Date" runat="server" Text='<%# Bind("Time") %>'></asp:Label></small>
            </div>
        </div>
    </ItemTemplate>
</asp:DataList>