如何获取Json中给定后代的所有数组值

时间:2017-02-19 22:25:20

标签: c# arrays json json.net

    {
  "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

1 个答案:

答案 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