C#中将JSON转换为字典的可能方法

3
我是一个对JSON的概念稍有生疏的人,所以请多包涵。
我有一个方法,它返回下面这个又长又复杂的字符串:
[{\"identifierType\":\".Identifier\",\"title\":\"Test\",\"typeName\":\"Application1\",\"key\":\"1\",\"internalId\":1},{\"identifierType\":\".Identifier\",\"title\":\"Test2\",\"typeName\":\"Application2\",\"key\":\"2\",\"internalId\":15},{\"identifierType\":\".Identifier\",\"title\":\"Test3\",\"typeName\":\"Application3\",\"key\":\"3\",\"internalId\":1124},{\"identifierType\":\".Identifier\",\"title\":\"Test4\",\"typeName\":\"Application4\",\"key\":\"4\",\"internalId\":2241}]

她看起来又长又丑,但这是我要处理的内容。

经过一番搜索,我发现这是一个 JSON 字符串,并且可以在 C# 中映射为一个字典。

接着,经过更多的搜索,我找到了以下内容:

Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(s);

在这种情况下,s 是我长而丑陋的字符串。
问题是运行时会抛出错误。
“无法将当前 JSON 数组(如 [1,2,3])反序列化为类型 'System.Collections.Generic.Dictionary`2[System.String,System.String]',因为该类型需要 JSON 对象(如 {"name":"value"})才能正确反序列化。
要解决此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"}),或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化的 List。也可以向类型添加 JsonArrayAttribute 强制它从 JSON 数组反序列化。
路径 '',行 1,位置 1。
由于我在 JSON 方面很新手,所以被这个问题难住了。
我的不太美观的 s 不是我想象中的 JSON 字符串吗?
如果是的话,这理论上应该可以工作,对吧?
我还预见到一个问题,就是 s 中似乎有多个对象。当我尝试将其映射到一个 Dictionary 时,这不会引起问题吗?
我需要将 s 映射到多个 Dictionary 吗?
请给予建议。

你尝试过使用 List<Dictionary<string, string>> values = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(s); 吗?因为你的 JSON 文本以 [ 开头。 - Orifjon
这些转义引号实际上在 JSON 中吗? - Ewan
您的JSON格式似乎无效,请在此处测试它,该网站可以检测JSON的有效性 http://codebeautify.org/jsonvalidate - Aram Tchekrekjian
它是有效的,只是被转义为c#字符串字面量。请用""替换所有"` :) - Tamás Deme
尝试去掉字符串开头和结尾的方括号,因为它会将你的字符串转换为数组,而反序列化程序无法正确识别它。你的源字符串中有4个由逗号分隔的项,因此要正确反序列化它,你需要创建一个字典列表。 - Damian Kobak
3个回答

3
你的json是一个数组,假设里面有YourJsonObject,因此你可以将其反序列化为List<YourJsonObject>
在这种情况下,http://json2csharp.com网站非常有用,只需将你的json粘贴到该网站即可生成以下类:
public class YourJsonObject
{
    public string identifierType { get; set; }
    public string title { get; set; }
    public string typeName { get; set; }
    public string key { get; set; }
    public int internalId { get; set; }
}

var list = JsonConvert.Deserialize<List<YourJsonOject>>(s);

可以帮助您得到所需的内容。如果您真的想这么做,您也可以将其反序列化为一个字典列表,就像我上面的评论者建议的那样,但是由于它还包含一个整数,所以这种方式可能更好。


太完美了!正是我所需要的!而且http://json2csharp.com这个工具非常方便。给你点赞并评为最佳答案,朋友! - ViRALiC

2

首先,让我们美化你的JSON。我使用了JsonEditorOnline的往返功能,这个网站对于一次性调查JSON数据非常有用:

[
  {
    "identifierType": ".Identifier",
    "title": "Test",
    "typeName": "Application1",
    "key": "1",
    "internalId": 1
  },
  {
    "identifierType": ".Identifier",
    "title": "Test2",
    "typeName": "Application2",
    "key": "2",
    "internalId": 15
  },
  {
    "identifierType": ".Identifier",
    "title": "Test3",
    "typeName": "Application3",
    "key": "3",
    "internalId": 1124
  },
  {
    "identifierType": ".Identifier",
    "title": "Test4",
    "typeName": "Application4",
    "key": "4",
    "internalId": 2241
  }
]

JSON有一个很好的特点,如果你知道基础知识,它非常容易被人类阅读。方括号[ ]表示数组,大括号{ }表示对象。
在这种情况下,你有一个对象数组,其属性为identifierTypetitletypeNamekeyinternalId

将其转换为C#中可操作的数据最简单的方法是创建一个与此结构相匹配的类:

public class MyItem // pick a better name, of course
{
    [JsonProperty("identifierType")]
    public string IdentifierType { get; set; }

    // add the other properties in the same fashion
}

然后,你可以将该JSON转换为你的数据结构:
var items = JsonConvert.DeserializeObject<List<MyItem>>( yourJsonString );

一个巨大的+1给你一个很棒的答案。我发现下面这个稍微容易理解一些,但如果我能给你+10,我会的! - ViRALiC

-1

你的's'不是一个json。

它是一个json对象的json数组。 在C#中可以称为字典的列表。

例如-

Json数组:

[{"d":1},{"y":1},{"z":3}]

解决方法可以将其解析为json数组,然后对于每个值创建一个字典。

Json对象:

{"a":1,"b":2}


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