尝试将 JSON 转换为 [键,值] 字典



我正在使用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不是字典,而是字典数组。您可以将它们全部合并到一个字典中,如下所示:

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);

下面是将字符串字典序列化为 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"中生成源文件的任何内容都是问题的根源。

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

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

相关内容

  • 没有找到相关文章

最新更新