C#反序列化Json未知键

8
我有这个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文件中获取键和值,但使用这段代码时,它说第3行位置13处有一个意外的字符。 我尝试了很多不同的方式,但无法同时获取值和键。有些代码只得到了键,而另一些代码只得到了值。您能否告诉我如何获取键和值?

3个回答

9
您可以直接将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);
}

1
问题在于您正在尝试反序列化的类型。您正在尝试将其反序列化为Dictionary,但是虽然第一个条目是一对字符串,但promos本身是一个字典,因此无法将“promos”的值转换为字符串!假设您的json文件名为“json.json”,则可以通过迭代promos JObject并将获得的项转换为JProperty来获得Dictionary,如下所示:
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());

1
您的数据不是一个Dictionary<string, string>,因为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:无法将newtonsoft.json.linq.jobject强制转换为newtonsoft.json.linq.jtoken。这是什么意思?我该如何解决它? - ThePHPAddicted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接