{
"hasLoadMore": true,
"groups": [
{
"order": 0,
"title": "string",
"total": 0,
"dateFormat": "string",
"messages": [
{
"commsId": 0,
"commsDirectionCode": "string",
"commsReasonCRSNN": 0,
"commsDeliveryChannelCDCHN": "string",
"commsDeliveryStateCode": "string",
"commsDeliveryDttm": "2017-02-14T02:20:52.836Z",
"commsSuccessFlag": true,
"commsCode": "string",
"commsName": "string",
"commsRankingNumb": 0,
"customerGrainCUSGN": 0,
"productItemCode": "string",
"sourceApplBAPPN": 0,
"sourceCommsRefn": "string",
"parentCommsId": 0,
"campaignDttm": "2017-02-14T02:20:52.836Z",
"campaignCode": "string",
"campaignName": "string",
"contentValidStartDttm": "2017-02-14T02:20:52.836Z",
"contentValidEndDttm": "2017-02-14T02:20:52.836Z",
"trackingCode": "string",
"headlineDisplayText": "string",
"contentDisplayText": "string",
"topic": "string",
"topicIconClass": "string",
"contentTemplateId": 0,
"contentTemplateVersNumb": 0,
"archiveDate": "2017-02-14T02:20:52.836Z",
"commsParameters": [
{
"commsId": 0,
"paramSeqNumb": 0,
"paramText": "string",
"paramValue": "string"
}
],
"contentTemplateParameters": [
{
"commsId": 0,
"paramSeqNumb": 0,
"paramText": "string",
"paramValue": "string"
}
],
"callToAction": [
{
"displayText": "string",
"uri": "string"
}
],
"isFlagged": true,
"isSeen": true,
"isRead": true,
"isActioned": true
}
]
}
]
}
我的json在上面,现在我在上面的json中有多个'callToActions'
数组,想要收集所有这些并与表进行比较。
我正在做的事情如下:
{
string content = Context.Response.Content.ReadAsStringAsync().Result;
var resultObjects = AllChildren(JObject.Parse(content))
.First(c => c.Type == JTokenType.Array && c.Path.Contains(decendant))
.Children<JObject>();
JArray responseList = new JArray();
foreach (JObject result in resultObjects)
{
responseList.Add(result);
}
CompareObjectToTable(responseList, table);
}
private static IEnumerable<JToken> AllChildren(JToken decendant)
{
foreach (var c in decendant.Children())
{
yield return c;
foreach (var cc in AllChildren(c))
{
yield return cc;
}
}
}
但它只会给我遇到的"First"
数组,但我想收集所有数组(多个)和相同的后代。我想要的是后代callToActions
答案 0 :(得分:1)
您可以使用内置方法JContainer.DescendantsAndSelf()
或JToken.SelectTokens()
为您执行此操作,而不是手动编码自己的方法以递归下降JToken
层次结构。
使用第一种方法,您可以:
var root = (JContainer)JToken.Parse(content);
var descendant = "callToAction";
var query = root
// Recursively descend the JSON hierarchy
.DescendantsAndSelf()
// Select all properties named descendant
.OfType<JProperty>()
.Where(p => p.Name == descendant)
// Select their value
.Select(p => p.Value)
// And filter for those that are arrays.
.OfType<JArray>();
使用第二种方法:
var root = JToken.Parse(content);
var descendant = "callToAction";
var query = root
// Recursively descend the JSON hierarchy using the JSONpath recursive descent operator "..", and select the values of all properties named descendant
.SelectTokens(string.Format("..{0}", descendant))
// And filter for those that are arrays.
.OfType<JArray>();
请注意,我使用JSONPath递归下降运算符".."
来降级层次结构。 Json.NET的SelectTokens()
方法supports JSONPath query syntax与XPath有些相似。
现在,从你的问题不清楚responseList
是否应该是结果数组的数组,或者是一组平坦的结果。要创建数组数组,只需执行:
var responseList = new JArray(query);
要创建展平数组,请执行以下操作:
var responseList = new JArray(query.SelectMany(a => a));
示例fiddle。