如何正确反序列化Json字符串

时间:2019-06-12 13:56:42

标签: c# json parsing json.net json-deserialization

将Json字符串解析为C#JObject时遇到问题。最终结果与起始字符串不一致。

var original = "{\"System.String\":[\"AAEAAAD/////AQAAAAAAAAAGAQAAAA53d3cuZ29vZ2xlLmNvbQs=\", \"mscorlib\"],\"System.Boolean\":[\"AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=\", \"mscorlib\"],\"System.Boolean\":[\"AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=\", \"mscorlib\"]}";
var parsed = JObject.Parse(original);

这可行,但是我的解析对象实际上是这样的:

{{
  "System.String": [
    "AAEAAAD/////AQAAAAAAAAAGAQAAAA53d3cuZ29vZ2xlLmNvbQs=",
    "mscorlib"
  ],
  "System.Boolean": [
    "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=",
    "mscorlib"
  ]
}}

您可以看到它删除了其中一个对象,为什么?

我也尝试过使用适当的转换器

var parsed2 = JsonConvert.DeserializeObject<JObject>(original);

我可以通过超载设置来解决此问题吗?

1 个答案:

答案 0 :(得分:1)

JSON不能包含两个具有相同密钥的项目。

System.Boolean在您的JSON中出现两次。

要举例说明为什么会出现此问题,只需考虑一下您期望parsed["System.Boolean"]返回的内容是什么?

如果您要解析的JSON是由系统创建的,则可以对其进行修改,使其包含对象数组,而不是直接在其中包含键/值对。

示例:

{ 
  "items" : [
      {
      "System.String": [
        "AAEAAAD/////AQAAAAAAAAAGAQAAAA53d3cuZ29vZ2xlLmNvbQs=",
        "mscorlib"]
      },
      {
        "System.Boolean": [
        "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=",
        "mscorlib"]
      }
    ]
}