【问题标题】:Trying to convert JSON to [Key,Value] dictionary尝试将 JSON 转换为 [Key,Value] 字典
【发布时间】:2018-11-13 03:47:11
【问题描述】:

我正在使用 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]”,因为该类型需要 JSON 对象(例如{"name":"value"}) 正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。 JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组中反序列化。 路径'',第 1 行,位置 1。

为什么会这样?

谢谢!

【问题讨论】:

  • 这看起来不像是字符串字典的有效 JSON 字符串,字符串。
  • 这看起来更像是一个字典数组,而不是一个字典。它还有几个元素,将它合并到一个字典中可能会导致重复键,所以也许你应该在这里重新考虑你的方法。
  • 好的,那我怎样才能把它转换成字符串字典呢?
  • 我还想指出,"&lt;script&gt;":"&amp;lt;script&amp;gt;"/ 行会导致您在结尾处出现正斜杠问题。

标签: c# json json.net


【解决方案1】:

就像我在 cmets 中所说,您的 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,否则您应该将其保留为字典数组(因为它就是这样):

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

【讨论】:

    【解决方案2】:

    这是一个将字符串字典序列化为 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);
    

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

    您可能会发现在“JSON_FILE_PATH”中生成源文件的任何内容都是问题的根源。

    【讨论】:

    • 问题不在于序列化字典。这是关于将 OP 已经拥有的 JSON 数据反序列化到字典中。
    • 同意.. 但似乎 OP 不确定他的 JSON 文件的有效性,因此正试图帮助他诊断他的问题。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-07
      • 2016-12-14
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 2021-05-04
      • 2019-08-08
      • 1970-01-01
      相关资源
      最近更新 更多