【问题标题】:How to correctly deserialize a Json string如何正确反序列化 Json 字符串
【发布时间】:2019-06-12 13:56:42
【问题描述】:

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

我可以通过重载设置来解决这个问题吗?

【问题讨论】:

  • 您的 json 无效。您不能有两个同名的属性 (System.Boolean)。使用数组而不是对象来保存您的值。

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


【解决方案1】:

JSON 不能包含具有相同键的 2 个项目。

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

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

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

例子:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多