从JSON C#获取部分对象列表

时间:2016-03-22 02:23:06

标签: c# json rest json.net

我在C#中调用RESTful服务,结果类似于:

{
  "blabla":1,
  "bbb":false,
  "blabla2":{
    "aaa":25,
    "bbb":25,
    "ccc":0
  },
  "I_want_child_list_from_this":{
     "total":15226,
     "max_score":1.0,
     "I_want_this":[
       {
        "A":"val1",
        "B":"val2",
        "C":"val3"
       },
       {
        "A":"val1",
        "B":"val2",
        "C":"val3"
       }
       ...
      ]
  "more_blabla": "fff"
  ... 
}

我想得到" I_want_this"部分为listobject JObject 有什么像

(JObject)responseString["I_want_child_list_from_this"]["I_want_this"]

更一般地说:

(JObject)responseString["sub"]["sub_sub"]

我正在使用Newtonsoft.Json

谢谢!

3 个答案:

答案 0 :(得分:2)

首先,我将创建一个表示服务调用返回的JSON结构的类。 (http://json2csharp.com/用于从JSON自动生成类的实用工具

其次,如果您不使用Newtonsoft.Json库,我会建议抓取该库。

最后,使用Newtonsoft将服务调用中的JSON反序列化为您创建的类:

var json = Service.GetJson();
var yourDesiralizedJson = JsonConvert.DeserializeObject<YourJsonToCSharpClass>(json);
var listYouWant = yourDesiralizedJson.IWantChildList.IWantThis;

答案 1 :(得分:1)

最佳解决方案(imo)是定义描述JSON模式的类,然后使用DeserializeObject,如ertdiddy所建议的那样。作为一种快捷方式,您可以使用DeserializeAnonymousType对模式的不完整定义,充分利用JSON的宽大处理。在您的情况下,此代码对我有用:

        var testDataFromQuestion = @"
{
  ""blabla"":1,
  ""bbb"":false,
  ""blabla2"":{
    ""aaa"":25,
    ""bbb"":25,
    ""ccc"":0
  },
  ""I_want_child_list_from_this"":{
     ""total"":15226,
     ""max_score"":1.0,
     ""I_want_this"":[
       {
        ""A"":""val1"",
        ""B"":""val2"",
        ""C"":""val3""
       },
       {
        ""A"":""val1"",
        ""B"":""val2"",
        ""C"":""val3""
       }
      ],
  ""more_blabla"": ""fff""
}";

        var anonymousDefinitionOfJson = new {
           I_want_child_list_from_this = new {
               I_want_this = new Dictionary<string, string>[] {}
           }
        };
        var fullDeserializationOfTestData =
           JsonConvert.DeserializeAnonymousType(testDataFromQuestion,
                                                anonymousDefinitionOfJson);
        var stuffYouWant = insterestingBits.I_want_child_list_from_this.I_want_this;
        Console.WriteLine($"The first thing I want is {stuffYouWant[0]["A"]}");

输出预期值&#34; val1&#34;。我匿名定义了只获取所需数据的最小类,然后我要求Newtonsoft解析得足以填充这些类。

答案 2 :(得分:1)

以下链接似乎接近解决方案,因为请求者使用NewtonSoft.Json作为他的api来操纵对象。感谢其他用户的解决方案。

看看例如这里是newtonsoft.com/json/help/html/SerializingJSONFragments.htm