C# C中可能的JSON到字典#

C# C中可能的JSON到字典#,c#,json,dictionary,C#,Json,Dictionary,我对JSONs的概念有点陌生,所以请耐心听我说 我有一个方法返回以下长而复杂的字符串: [{\"identifierType\":\".Identifier\",\"title\":\"Test\",\"typeName\":\"Application1\",\"key\":\"1\",\"internalId\":1},{\"identifierType\":\".Identifier\",\"title\":\"Test2\",\"typeName\":\"Application2\",\"

我对
JSON
s的概念有点陌生,所以请耐心听我说

我有一个方法返回以下长而复杂的字符串:

[{\"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

现在,在谷歌搜索了一下之后,我得出了以下结论:

Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(s);
Dictionary values=JsonConvert.DeserializeObject;
在本例中,
s
是我的又长又难看的字符串

问题是,这会在运行时引发错误

无法将当前JSON数组(例如[1,2,3])反序列化为类型 'System.Collections.Generic.Dictionary'2[System.String,System.String]' 因为该类型需要一个JSON对象(例如{“name”:“value”})来 正确地反序列化

要修复此错误,请将JSON更改为JSON对象(例如。 {“name”:“value”})或将反序列化类型更改为数组或 实现集合接口的类型(例如ICollection、IList) 类似于可以从JSON数组反序列化的列表。 还可以将JsonArrayAttribute添加到类型中,以强制它 从JSON数组反序列化

路径“”,第1行,位置1

现在我在
JSON
中就像一棵卷心菜一样绿,我被这句话弄得目瞪口呆

我的
s
不是我以为的
JSON
字符串吗

如果她是,那么这在理论上是否可行

我还预见到一个问题,即
s
中似乎有多个对象。当我试图将它映射到
字典时,这不会引起麻烦吗

我是否必须将
s
映射到多个
Dictionary
s


请告知。

您的“s”不是json

它的Json对象数组。 在C#术语中表示词典列表

例如-

杰索纳雷:

[{“d”:1},{“y”:1},{“z”:3}]

解决方案可以解析为json数组,然后foreach值创建一个字典

Json对象:


{“a”:1,“b”:2}

您的json是一个数组,比如说
YourJsonObject
,因此您可以将其反序列化到
列表中

该站点在这些场景中非常方便,因此通过将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


给你想要的东西。如果你真的想,你可以像我上面的一位评论员所建议的那样,将它反序列化到一个字典列表中,但由于它也包含一个整数,这样可能更好。

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

[
{
“identifierType”:“.Identifier”,
“标题”:“测试”,
“类型名称”:“应用程序1”,
“密钥”:“1”,
“内部ID”:1
},
{
“identifierType”:“.Identifier”,
“标题”:“测试2”,
“类型名称”:“应用程序2”,
“密钥”:“2”,
“内部ID”:15
},
{
“identifierType”:“.Identifier”,
“标题”:“Test3”,
“类型名称”:“应用程序3”,
“密钥”:“3”,
“内部ID”:1124
},
{
“identifierType”:“.Identifier”,
“标题”:“测试4”,
“类型名称”:“应用程序4”,
“密钥”:“4”,
“内部ID”:2241
}
]
JSON有一个很好的特性,即如果你知道基本知识,它真的很容易被人阅读。括号
[]
表示数组,括号
{}
表示对象。
在本例中,您有一个对象数组,其属性为
identifierType
title
typeName
key
internalId

将其转换为可在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
}
var items = JsonConvert.DeserializeObject<List<MyItem>>( yourJsonString );
然后,您可以将该JSON转换为您的数据结构:

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

    // add the other properties in the same fashion
}
var items = JsonConvert.DeserializeObject<List<MyItem>>( yourJsonString );
var items=JsonConvert.DeserializeObject(yourJsonString);

您是否尝试过
列出值=JsonConvert.DeserializeObject?因为您的JSON文本以
[
开头,所以这些转义引号实际上在JSON中吗?您的JSON似乎无效,请在此处测试,它给出的JSON无效。它是有效的,只是作为c字符串文本转义。将所有
\“
替换为
s:)尝试去掉字符串开头和结尾的方括号,因为它从字符串中生成数组,但是反序列化程序无法正确识别它。源字符串中有4项由coma分隔,因此要正确反序列化,您需要创建List od Dictionary。大量的+1表示一个很好的答案。I f下面这句话稍微容易理解,但如果我能给你+10,我会的!太好了!正是我所需要的!这是一个多么方便的工具啊。+1对你来说是最好的答案,朋友!