2017-03-16 66 views
0

我使用Newtonsoft.Json任何试图JSON转换为Dictionary<string,string>试图JSON转换为[键,值]字典

这是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数组(例如,因为类型需要一个JSON对象(例如{“name”:“value”}),因此类型'System.Collections.Generic.Dictionary`2 [System.String,System.String]'反序列化正确。 要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为实现集合接口(例如ICollection,IList)的数组或类型,如List可以从JSON数组中反序列化。 JsonArrayAttribute也可以添加到类型中,以强制它从JSON数组反序列化。 Path'',line 1,position 1.

为什么它的发生?

谢谢!

+0

使用SwiftyJSON https://github.com/SwiftyJSON/SwiftyJSON –

+0

这看起来并不像一个有效的JSON字符串,字符串,字符串的字典。 – Wheels73

+0

这看起来更像是一个字典数组,而不是单个字典。它也有几个元素将它合并成单个字典可能会导致重复的键,所以也许你应该在这里重新思考你的方法。 – Abion47

回答

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”中生成源文件都是问题的根源。

+0

问题不在于序列化字典。它关于反序列化OP已经存在的字典中的JSON数据。 – Abion47

+0

同意..但似乎OP不确定他的JSON文件的有效性,所以试图帮助他诊断他的问题。 – Wheels73

1

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

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

就像我在评论中所说的,你的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);