【问题标题】:C# deserialize Json unknown keysC# 反序列化 Json 未知键
【发布时间】:2016-07-16 12:44:17
【问题描述】:

我有这个 JSON,我必须反序列化它:

{
  "homepage": "http://files.minecraftforge.net/maven/net/minecraftforge/forge/",
  "promos": {
    "1.10-latest": "12.18.0.2000",
    "1.10.2-latest": "12.18.1.2014",
    "1.10.2-recommended": "12.18.1.2011",
    "1.5.2-latest": "7.8.1.738",
    "1.5.2-recommended": "7.8.1.737",
    "1.6.1-latest": "8.9.0.775",
    "1.6.2-latest": "9.10.1.871",
    "1.6.2-recommended": "9.10.1.871",
    "1.6.3-latest": "9.11.0.878",
    "1.6.4-latest": "9.11.1.1345",
    "1.6.4-recommended": "9.11.1.1345",
    "1.7.10-latest": "10.13.4.1614",
    "1.7.10-latest-1.7.10": "10.13.2.1343",
    "1.7.10-recommended": "10.13.4.1558",
    "1.7.2-latest": "10.12.2.1147",
    "1.7.2-recommended": "10.12.2.1121",
    "1.8-latest": "11.14.4.1577",
    "1.8-recommended": "11.14.4.1563",
    "1.8.8-latest": "11.15.0.1655",
    "1.8.9-latest": "11.15.1.1902",
    "1.8.9-recommended": "11.15.1.1722",
    "1.9-latest": "12.16.0.1942",
    "1.9-recommended": "12.16.1.1887",
    "1.9.4-latest": "12.17.0.1990",
    "1.9.4-recommended": "12.17.0.1976",
    "latest": "12.18.1.2014",
    "latest-1.7.10": "10.13.2.1343",
    "recommended": "12.18.1.2011"
  }
}

在这个网站上搜索了很多,我得到了这个代码:

dynamic json = JsonConvert.DeserializeObject<Dictionary<string, string>>(data);
foreach (KeyValuePair<string, string> entry in json["promos"])
{
    MessageBox.Show(entry.Key);
    MessageBox.Show(entry.Value);
}

我需要从该 Json 中获取 Key 和 Value,但是使用此代码时,它表示第 3 行 pos 13 上有一个意外字符。 我尝试了很多不同的方式,但我无法同时获得价值和关键。使用一些代码,我得到了密钥,而使用其他一些代码,我得到了值。你能解释一下如何同时获得 value 和 key 吗?

【问题讨论】:

    标签: c# json visual-studio json.net


    【解决方案1】:

    您可以直接将json解析为JObject并将节点“promos”转换为Dictionary

    var json = JObject.Parse(data);
    var promos = json["promos"].ToObject<Dictionary<string, string>>();
    foreach (var entry in promos)
    {
        MessageBox.Show(entry.Key);
        MessageBox.Show(entry.Value);
    }
    

    【讨论】:

      【解决方案2】:

      问题在于您尝试反序列化的类型。 您正在尝试将其反序列化为字典,但是虽然第一个条目是一对字符串,但 promos 本身就是字典,因此您不能将“promos”的值转换为字符串! 假设您的 json 在一个名为“json.json”的文件中,您可以通过迭代 promos JObject 来获取 Dictionary,并将您获得的项目转换为 JProperty,以这种方式:

      var json = File.ReadAllText("json.json");
      var deserialized = JsonConvert.DeserializeObject<JObject>(json);
      
      var dictionary = new Dictionary<string, string>();
      
      foreach (JProperty item in deserialized["promos"])
          dictionary.Add(item.Name, item.Value.ToString());
      

      【讨论】:

        【解决方案3】:

        您的数据不是Dictionary&lt;string, string&gt;,因为promos 的值不是string,而是字典。

        您可以反序列化为 JObject,然后获取您的 promos 属性的值。

        JObject json = JsonConvert.DeserializeObject<JObject>(data);
        //var promos = json.Value<Dictionary<string, string>>("promos");
        var promos = data["promos"].ToObject<Dictionary<string, string>>();
        foreach (KeyValuePair<string, string> entry in promos) {
           //do some stuff
        }
        

        编辑

        不确定,为什么原来的方法行不通,现在没有时间调查,但是第二行应该可以。

        【讨论】:

        • 它说 System.InvalidCastException: Cannot cast newtonsoft.json.linq.jobject into newtonsoft.json.linq.jtoken。这是什么意思?我该如何解决?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-21
        相关资源
        最近更新 更多