Разбор JSON, где узел имеет числовое значение - PullRequest
0 голосов
/ 24 мая 2018

Как мне разобрать следующий JSON, чтобы получить значение TestCycleName.Сложность заключается в идентификации корневого узла, поскольку он начинается с числа.

Моя реализация будет на C # с использованием JSON.net

{
  "URL": "rest/zapi/latest/cycle?projectId=##projectId##&versionId=##versionId##",
  "Method": "GET",
  "Parameters": {
    "1": {
      "VersionName": "Custom Pipes Development",
      "TestCycleName": "SetMaxFutureDateFromCustomerField_Mobile"
    },
    "2": {
      "VersionName": "Recurring payments 1.5",
      "TestCycleName": "Internet Full Regression Pack - Mobile"
    },
    "3": {
      "VersionName": "Customer Profile Phase 1.5",
      "TestCycleName": "Customer Profile Regression Pack - Desktop"
    },
    "4": {
      "VersionName": "Customer Profile Phase 1.5",
      "TestCycleName": "Customer Profile E2E Pack - Desktop"
    },
    "5": {
      "VersionName": "Customer Profile Phase 1.5",
      "TestCycleName": "Customer Profile Regression Pack - Mobile"
    },
    "6": {
      "VersionName": "Internet Phase 1.2",
      "TestCycleName": "Internet API Regression Pack"
    },
    "7": {
      "VersionName": "Internet Phase 1.2",
      "TestCycleName": "Internet GUI Regression Pack - Desktop"
    },
    "8": {
      "VersionName": "Internet Phase 1.2",
      "TestCycleName": "Internet GUI Regression Pack - Mobile"
    },
    "9": {
      "VersionName": "Internet Phase 1.2",
      "TestCycleName": "Regression Library Admin Tool - E2E Tests"
    },
    "10": {
      "VersionName": "Internet Phase 1.2",
      "TestCycleName": "Regression Library E2E Tests - Mobile"
    },
    "11": {
      "VersionName": "Recurring payments 1.5",
      "TestCycleName": "[Internet] Autopay API Automation Regression Pack"
    }
  }
}

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Parameters - это словарь, поэтому вы можете написать что-то вроде этого:

public class Rootobject
{
    public string URL { get; set; }
    public string Method { get; set; }
    public Dictionary<int, Parameter> Parameters { get; set; }
}

public class Parameter
{
    public string VersionName { get; set; }
    public string TestCycleName { get; set; }
}

и затем десериализовать его:

var result = JsonConvert.DeserializeObject<Rootobject>(json_string);

//You can get your TestCycleNames for example in string array
string[] testCycleName = result.Parameters.Select(p => p.Value.TestCycleName).ToArray(); 
0 голосов
/ 24 мая 2018

Попробуйте коды следующим образом:

using Newtonsoft.Json.Linq;
using System;
using System.Linq;


namespace ConsoleApp1
{
  class Program
  {
    static void Main(string[] args)
    {
        string jsonString = "{\"URL\": \"rest/zapi/latest/cycle?projectId=##projectId##&versionId=##versionId##\",\"Method\": \"GET\",\"Parameters\": {\"1\": {\"VersionName\": \"Custom Pipes Development\",\"TestCycleName\": \"SetMaxFutureDateFromCustomerField_Mobile\"},\2"\": {\"VersionName\": \"Recurring payments 1.5\",\"TestCycleName\": \"Internet Full Regression Pack - Mobile\"}}}";

        var parameters = JObject.Parse(jsonString)["Parameters"];

        foreach (var item in parameters.OfType<JProperty>())
        {
            var innerObject = JObject.Parse(item.Value.ToString())["TestCycleName"];

            Console.WriteLine(innerObject.ToString());
        }

        Console.ReadLine(); 
    }
  }
}
0 голосов
/ 24 мая 2018

Попробуйте что-то вроде этого (конечно, не проверено, но вы можете отладить его):

// You get Parameters object
var parameters = JObject.Parse(jsonString)["Parameters"];

// parameters can further be accessed via key/value pair using JProperty
foreach( var item in parameters.OfType<JProperty>()){

  // each item has a key and a value i.e item.Name and item.Value, 
  // key = numeric in your data, value is a json object.
  // take object and further parse it to reach TestCycleName

  var innerObject = JObject.Parse(item.Value.ToString())["TestCycleName"];

  Console.WriteLine(innerObject.ToString());

}

У меня было что-то похожее, посмотрите здесь: Итерация ключей JObject

...