Как обрабатывать массивы в массиве?

У меня есть массив массивов массивов как JSON, пример включен ниже, где

F1 = Feature #1
P1 = Point #1
X / Y = Coordinates

так F1P1Xже как и X-значение точки #1 объекта #1.

[
    [
        [F1P1X,F1P1Y,null],
        [F1PnX,F1PnY,null]
    ],
    [
        [F2P1X,F2P1Y,null],
        [F2PnX,F2PnY,null]
    ],
    [
        [FnP1X,FnP1Y,null],
        [FnPnX,FnPnY,null]
    ]
]

Вот код, который я использую, чтобы получить вышеуказанный JSON из файла:

string json = File.ReadAllText("ABC.json");
JObject obj = JObject.Parse(json);
JToken token = obj.SelectToken("$.features[?(@.name == 'X')]['XY']");
var paths = JToken.Parse(token.ToString()).SelectToken("XYZ");

Далее, мне нужно построить строки, используя различные массивы. Как получить массив второго уровня (объект), чтобы я мог обработать его самые внутренние массивы (точки на объектах)? Конец будет List<string>там, где каждая строка является объектом (массив второго уровня в JSON), а самый внутренний массив-это точки, которые составляют объект. Я могу справиться со Строковой манипуляцией, но сначала мне нужно получить массивы из JSON.

1 ответ

  1. Хороший выбор Json.NET пакет nuget для работы с JSON. У меня есть создать метод тестирования для вас.

    //Read your json file 
    string json = File.ReadAllText("ABC.json");
    //deserialize
    F1P1X[][][] yourArrayOfArraysOfArrays = JsonConvert.DeserializeObject<F1P1X[][][]>(json).ToList();
    
      public class F1P1X
      {
         public string Feature { get; set; }
         public string Point { get; set; }
         public string Coordinates { get; set; }
      }
    
      public static void Test()
      {
         F1P1X[] test1Array = new[] 
         {
            new F1P1X
            {
               Feature = "F1",
               Point = "P1",
               Coordinates = "X1"
            },
            new F1P1X
            {
               Feature = "F2",
               Point = "P2",
               Coordinates = "X2"
            },
         };
    
         F1P1X[] test2Array = new[] 
         {
            new F1P1X
            {
               Feature = "F3",
               Point = "P3",
               Coordinates = "X3"
            },
            new F1P1X
            {
               Feature = "F4",
               Point = "P4",
               Coordinates = "X4"
            },
         };
    
         F1P1X[][] test = {test1Array, test2Array};
         F1P1X[][] test2 = { test1Array, test2Array };
         F1P1X[][][] top = {test, test2};
    
         //array of arrays of arrays as JSON
         string json = JsonConvert.SerializeObject(top);
         List<F1P1X[][]> arrays = JsonConvert.DeserializeObject<F1P1X[][][]>(json).ToList();
    
         foreach (F1P1X[][] item in arrays)
         {
            foreach (F1P1X[] f1P1X in item)
            {
               foreach (F1P1X p1X in f1P1X)
               {
                  //do some magic 
               }
            }
         }
    
    
         // or use linq
         var result = arrays.SelectMany(x => x.SelectMany(y => y.Where(z => z.Coordinates == "X1")));
      }
    

    Эта инструкция linq возвращает список функций

    List<string> result = arrays.SelectMany(x => x.SelectMany(y => y.Select(z => z.Feature))).ToList();