我在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"部分作为object
或JObject
的list
有类似的东西吗
(JObject)responseString["I_want_child_list_from_this"]["I_want_this"]
更一般地说:
(JObject)responseString["sub"]["sub_sub"]
我正在使用Newtonsoft.Json
谢谢!
首先,我将创建一个表示从服务调用返回的JSON结构的类。(http://json2csharp.com/从JSON自动生成类的伟大实用程序)
其次,如果您不使用Newtonsoft.Json库,我建议您使用该库。
最后,使用Newtonsoft将JSON从服务调用反序列化为您创建的类:
var json = Service.GetJson();
var yourDesiralizedJson = JsonConvert.DeserializeObject<YourJsonToCSharpClass>(json);
var listYouWant = yourDesiralizedJson.IWantChildList.IWantThis;
下面的链接似乎接近解决方案,因为请求者使用NewtonSoft.Json作为他的api来操作对象。感谢其他用户提供的解决方案。
例如,在这里查看newtonsoft.com/json/help/html/SerializationJSONFragments.htm
最好的解决方案(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"]}");
这将输出预期值"val1"。我匿名定义了能得到你想要的数据的最小类,然后我要求Newtonsoft解析足够的数据来填充这些类。