试图将JSON转换为[Key,Value]字典

时间:2017-03-16 15:52:51

标签: c# json json.net

我使用Newtonsoft.Json尝试将JSON转换为Dictionary<string,string>

这是JSON文件:

[
{
        "<p dir=\"rtl\">":""
},
{
        "<p>":""
},
{
        "<p dir='rtl'>":""
},
{
        "<div dir='rtl'>":""
},
{
        "<div>":""
},
{
        "<div dir=\"rtl\">":""
},
{
        "<script>":"&lt;script&gt;"/
},
{
        "</script>":"&lt;/script&gt;"
},
{
        "<button>":"&lt;button&gt;"
},
{
        "<button":"&lt;button"
},
{
        "</button>":"&lt;/button&gt;"
},
{
        "&lt;br&gt;":"<br>"
},
{
        "&lt;br /&gt;":"<br>"
},
{
        "&lt;br/&gt;":"<br>"
},
{
        "&lt;/br&gt;":"<br>"
},
{
        "\"":""
}
]

这是代码:

var replaceTags = System.IO.File.ReadAllText(JSON_FILE_PATH);
Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(replaceTags);

我有以下例外:

  

无法将当前JSON数组(例如[1,2,3])反序列化为类型System.Collections.Generic.Dictionary`2 [System.String,System.String]&#39;因为类型需要JSON对象(例如{&#34; name&#34;:&#34; value&#34;})才能正确反序列化。   要修复此错误,请将JSON更改为JSON对象(例如{&#34; name&#34;:&#34; value&#34;})或将反序列化类型更改为实现集合接口的数组或类型(例如ICollection,IList)就像可以从JSON数组反序列化的List。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。   路径&#39;&#39;,第1行,第1位。

为什么会发生这种情况?

谢谢!

3 个答案:

答案 0 :(得分:3)

就像我在评论中所说,你的JSON不是字典,而是一系列字典。您可以将它们全部合并到一个字典中,如下所示:

string input = File.ReadAllText("file.json");
var jsonObj = JsonConvert.DeserializeObject<Dictionary<string, string>[]>(input);

var dict = jsonObj.SelectMany(d => d)
                  .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

但是,由于JSON的结构方式,我们不能保证不会有重复的密钥。为了防止这种情况,您还可以过滤掉任何可能的重复项:

var dict = jsonObj.SelectMany(d => d)
                  .GroupBy(kvp => kvp.Key)
                  .Select(g => g.First())
                  .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

在我看来,除非有一个很好的理由,你绝对需要将这个JSON序列化为单个Dictionary,你应该把它留作一个字典数组(因为那个&#39; s)它是什么):

string input = File.ReadAllText("file.json");
var dictArray = JsonConvert.DeserializeObject<Dictionary<string, string>[]>(input);

答案 1 :(得分:1)

对于字符串类型为字符串的字典,您对JSON是不对的。尝试更改格式以匹配:

{"key1":"value1","key2":"value2"}

答案 2 :(得分:1)

这是一个将字符串,字符串序列化为JSON文本的简单示例。一旦阅读,您的文本显然会来自您的文件路径。

var myd = new Dictionary<string, string>();
            myd.Add("1","A");
            myd.Add("2", "B");

            var dText = JsonConvert.SerializeObject(myd);

这将为您提供以下字符串。

{"1":"A","2":"B"}

然后将反序列化回字典。

var restoredDictionary = JsonConvert.DeserializeObject<Dictionary<string,string>>(dText);

建议你对此进行逆向工程。手动创建包含您期望的数据的字典。序列化它,看看文件内容应该是什么。

您可能会发现在&#34; JSON_FILE_PATH&#34;中生成源文件的任何内容;是你问题的根源。