Как мне разобрать JProperty, чтобы получить вложенные значения с переменными ключами - PullRequest
0 голосов
/ 15 апреля 2020

Учитывая, что у меня есть JObject:

{
    "results": {
        "payroll_report": {
            "314568": {
                "user_id": 314568,
                "client_id": "484781",
                "start_date": "2020-03-29",
                "end_date": "2020-04-04",
                "total_re_seconds": 49260,
                "total_pto_seconds": 94716,
                "total_work_seconds": 143976,
                "total_paid_break_seconds": 0,
                "total_unpaid_break_seconds": 0,
                "pto_seconds": {
                    "22322828": 57348,
                    "12597955": 37368
                },
                "total_ot_seconds": 0,
                "total_dt_seconds": 0,
                "timesheet_count": 16
            }
        }
    },
}

Как мне разобрать его, чтобы я мог узнать количество pto_seconds для 22322828?

Я уже могу получить total_pro_seconds и другие элементы на этом уровне, но я не могу понять, как получить вложенные значения.

Ответы [ 3 ]

0 голосов
/ 15 апреля 2020

Вы можете перечислить через JObject, (если ваш начальный JObject называется jObject)

var toEnumerate = (JObject)(jObject["results"]["payroll_report"]["314568"]["pto_seconds"]);

foreach(var pair in toEnumerate)
{
    Console.WriteLine("Key: " + pair.Key);
    Console.WriteLine("Value: " + pair.Value);
}

output:

Key: 22322828
Value: 57348
Key: 12597955
Value: 37368
0 голосов
/ 15 апреля 2020

Я предполагаю, что вы хотите получить доступ ко всем вложенным парам ключ-значение в элементе pto_seconds и предположить, что структура json всегда такая, как было указано в примере.

Вот полный код переберите список и получите значения. Мое второе предположение - значения типа long, поэтому я использовал jToken.First().Value<long>(). Если это decimal или другие типы, вы можете изменить его соответствующим образом.

var jObject = JsonConvert.DeserializeObject<JObject>(json);
var jTokenList = jObject["results"]["payroll_report"]["314568"]["pto_seconds"].Children().ToList();
foreach (var jToken in jTokenList)
{
    var ptoSecondKey = (jToken as JProperty).Name;
    var ptoSecondValue = jToken.First().Value<long>();
}

Альтернативный метод (без использования JObject): Вы можете иметь представление реального объекта вашей JSON структуры и вы можете использовать метод DeserializeObject<T> для анализа и возврата результатов в качестве вашего объекта.

Здесь ниже вы можете найти классы для вашего JSON:

public class ResultsMain
{
    [JsonProperty("results")]
    public ResultsDetail Results { get; set; }
}

public class ResultsDetail
{
    [JsonProperty("payroll_report")]
    public PayrollReport PayrollReport { get; set; }
}

public class PayrollReport
{
    [JsonProperty("314568")]
    public PayrollReportDetail Detail { get; set; }
}

public class PayrollReportDetail
{
    [JsonProperty("pto_seconds")]
    public Dictionary<string, long>  PtoSeconds { get; set; }
}

Для десериализации JSON к вашему типу. NET, вам нужно ниже одной строки кода:

var resultsMain = JsonConvert.DeserializeObject<ResultsMain>(json);

Вот снимок объекта resultMain: pto_seconds values in debug mode

0 голосов
/ 15 апреля 2020

Я не вижу проблем. См. Ниже 2 варианта:

static void Main(string[] args)
    {
        string json = File.ReadAllText("json1.json");
        JObject jObject = JObject.Parse(json);
        var results = jObject["results"];
        var payroll_report = results["payroll_report"];
        var user314568 = payroll_report["314568"];
        var total_pto_seconds = user314568["total_pto_seconds"];
        var pto_seconds = user314568["pto_seconds"];
        ///**************option1***********************
        var val1 = pto_seconds["22322828"];
        var val2 = pto_seconds["12597955"];

        Console.WriteLine($"22322828: {val1}");
        Console.WriteLine($"22322828: {val2}");

        ///**************option2***********************
        var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(pto_seconds.ToString());
        foreach (var item in dict)
        {
            Console.WriteLine($"{item.Key}: {item.Value}");
        }
        Console.ReadLine();
    }

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...