Json Разбор строки на пары ключ-значение словаря c# - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь преобразовать свою строку json в словарь, но мне это не удалось.

    {
  "healths": [
    {
      "serviceName": "UserMgt",
      "subService": [
        {
          "subServiceName": "Base",
          "status": 10
        },
        {
          "subServiceName": "Url",
          "description": "Url is bad",
          "status": 10
        },
        {
          "subServiceName": "Configuration",
          "status": 2
        }
      ]
    },
    {
      "serviceName": "ConfigurationMgt",
      "subService": [
        {
          "subServiceName": "url",
          "description": "urlis OK!",
          "status": 2
        },
        {
          "subServiceName": "Configuration Db",
          "status": 2
        }
      ]
    }
}...and so son

Итак, как вы видите, у нас есть имя службы, и на основе этого у нас есть subserviceName, затем снова service имя и subservicename. Обычно я хочу преобразовать это в словарь как пару ключ-значение, чтобы на основе ключа (службы) у нас была подуслуга значений (снова пара значений ключа).

Я пробовал много вещей, но не дает должного результата. например, с помощью newtonsoft nuget.

JObject jsonObj = JObject.Parse(formattedJson);
Dictionary<string, object> dictObj = jsonObj.ToObject<Dictionary<string, object>>();
foreach(var kv in dictObj)
{
  Console.WriteLine(kv.Key + "::::" + kv.Value);
}

В этом сценарии я получаю вывод как ключ в качестве здоровья и все как значение. Может ли кто-нибудь помочь мне в этом. Json и c# для меня новые. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Предполагая, что вы гарантированно имеете описанную структуру, вы можете выполнить десериализацию до JObject и использовать LINQ s ToDictionary для его обработки:

var dict = JsonConvert.DeserializeObject<JObject>(json)["healths"]
    .ToDictionary(
        s => s["serviceName"].ToString(), 
        s => s["subService"]
            .ToDictionary(ss => ss["subServiceName"].ToString(), ss => ss["status"].ToString()));

Где вы можно изменить ss => ss["status"].ToString(), чтобы выбрать то, что действительно необходимо в качестве значения subService.

0 голосов
/ 01 августа 2020

Вы можете использовать Newtonsoft. Json и десериализовать описанным ниже способом, вы можете определить тип object снова как Dictionary или в соответствии с вашими требованиями.

var temp = JsonConvert.DeserializeObject<Dictionary<string, object>>(str);

Вы JSON тоже не действовали, я поправил, добавив один ]

  {
    "healths": [{
            "serviceName": "UserMgt",
            "subService": [{
                    "subServiceName": "Base",
                    "status": 10
                },
                {
                    "subServiceName": "Url",
                    "description": "Url is bad",
                    "status": 10
                },
                {
                    "subServiceName": "Configuration",
                    "status": 2
                }
            ]
        },
        {
            "serviceName": "ConfigurationMgt",
            "subService": [{
                    "subServiceName": "url",
                    "description": "urlis OK!",
                    "status": 2
                },
                {
                    "subServiceName": "Configuration Db",
                    "status": 2
                }
            ]
        }
    ]
  }
...