【问题标题】:Json String parse into Dictionary key value pairs c#Json字符串解析成字典键值对c#
【发布时间】:2020-08-01 10:20:52
【问题描述】:

我正在尝试将我的 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,然后是服务名称和 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# 对我来说是新的。 提前致谢。

【问题讨论】:

  • 子服务的价值是什么?
  • 那么,你想要一个字典,其中每个键都是字符串,值是另一个带有子服务的字典?

标签: c# json dictionary json.net data-conversion


【解决方案1】:

假设你保证有描述的结构,你可以反序列化为JObject并使用LINQToDictionary来处理它:

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 =&gt; ss["status"].ToString() 以选择实际需要的subService 值。

【讨论】:

  • 如果我们基于 subserviceName 需要,我唯一需要做的就是我们可以有两个值。我的意思是对于当前的转换,我们有 1 个 subServiceNameas “Url”,我们的状态为 10 但是。如果我们想要描述值以及与我的 JSON 相同的 subserviceName。例如:ToDictionary(ss => ss["subServiceName"].ToString(), ss => ss["status"].ToString()));我们将 subServiceName 作为键,将值作为状态,但我希望状态和描述作为值,因为如果您会看到我的 JSON,那么我们也有描述。
  • @user2911592 你可以为值创建值元组(或引入类):ss =&gt; (status: ss["status"].ToString(), desc = ss["description"].ToString())
【解决方案2】:

您可以使用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
                }
            ]
        }
    ]
  }

【讨论】:

  • OP 已经反序列化为Dictionary&lt;string, object&gt;
猜你喜欢
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2018-08-12
  • 2021-01-31
  • 2015-02-02
  • 1970-01-01
相关资源
最近更新 更多