Учитывая значение JSON, как я могу получить значение родного брата? - PullRequest
1 голос
/ 25 апреля 2020

У меня есть приложение. NET Core 3.1 C#, читающее следующее JSON do c:

{
  "info": {
    "_postman_id": "b"
  },
  "item": [
    {
      "name": "GetEntityById via APIM",
      "item": [
        {
          "name": "Call 1",
          "url": {
            "raw": "urlforcall1"
          }
        },
        {
          "name": "Call 2",
          "url": {
            "raw": "urlforcall2"
          }
        }
      ]
    }
  ]
}

Я хочу выбрать значение для каждого item\item\name и каждого item\item\url\raw.

Итак, я хотел бы закончить с "Call 1":"urlforcall1" и "Call 2":"urlforcall2".

Я играл и могу получить значение из токена raw со следующим:

var jObject = JObject.Parse(jsonString);
var urls = jObject.SelectTokens("..raw");

Как я могу получить значение от родного брата его родителя, name?

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

Надеюсь, этот код поможет вам

using Newtonsoft.Json.Linq;
using System;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            string json = @"
            {
                'info': {
                     '_postman_id': 'b'
                },
                'item': [
                {
                     'name': 'GetEntityById via APIM',
                     'item': [
                     {
                          'name': 'Call 1',
                          'url': {
                          'raw': 'urlforcall1',
                     }
                 },
                 {
                     'name': 'Call 2',
                     'url': {
                     'raw': 'urlforcall2',
                 }
             }
         ]
     }
 ]
            }";

            dynamic d = JObject.Parse(json);

            foreach(var item in d.item)
            {
                foreach(var innerItem in item.item)
                {
                    Console.WriteLine($"'{innerItem.name}' : '{innerItem.url.raw}'");
                }
            }
        }
    }
}

Можно проверить здесь https://dotnetfiddle.net/xDr90O

1 голос
/ 25 апреля 2020

Чтобы ответить на ваш вопрос напрямую, если у вас есть JToken, вы можете оттуда перейти вверх, используя свойство Parent. В вашем случае вам нужно будет использовать его четыре раза, чтобы достичь желаемого уровня:

  • Родитель JValue, представляющий строку URL вызова, - это JProperty с именем raw
  • Родителем этого JProperty является JObject
  • Родителем этого JObject является JProperty с именем url
  • родителем этого JProperty является JObject, который также содержит свойство name

Оттуда вы можете перейти обратно вниз, используя синтаксический индексатор, чтобы получить значение name.

Итак, вы получите в итоге:

var jObject = JObject.Parse(jsonString);

foreach (JToken raw in jObject.SelectTokens("..raw"))
{
    string callName = (string)raw.Parent.Parent.Parent.Parent["name"];
    string urlForCall = (string)raw;
}
0 голосов
/ 25 апреля 2020

Вы можете сгладить внутренний массив item, используя метод SelectMany, в одну последовательность (поскольку внешний item токен также является массивом), а затем получить значения name и raw напрямую Speci c ключ

var jObject = JObject.Parse(jsonString);

var innerItems = jObject["item"]?.SelectMany(t => t["item"]);
foreach (var item in innerItems)
{
    var name = item["name"];
    var raw = item["url"]?["raw"];
}
...