我在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"部分为list
或object
JObject
有什么像
(JObject)responseString["I_want_child_list_from_this"]["I_want_this"]
更一般地说:
(JObject)responseString["sub"]["sub_sub"]
我正在使用Newtonsoft.Json
谢谢!
答案 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