【问题标题】:How to deserialize json string with an extra ""如何使用额外的“”反序列化 json 字符串
【发布时间】:2019-02-11 22:31:25
【问题描述】:

我输入了我想要反序列化的 Json 字符串

 {
      "ID":1,
      "Details":{
      "Product":""Boston,saline"",
      "cost":150.0
      } 
 }

   {
      "ID":1,
      "Details":{
      "Product":"Boston "Sample"",
      "cost":150.0
      } 
 }

当我尝试使用 $JsonConvert.DeserializeObject<JObject>(input) 时,它给了我错误提示 "After parsing a value an unexpected character was encountered",这是意料之中的。有没有办法可以反序列化这种字符串?

谢谢!

【问题讨论】:

  • 这些都是无效 JSON 的示例。您能否修复生成 JSON 的代码(或请求修复),以便正确转义多余的引号?
  • @Brian 此数据来自数据库源。该列是字符串类型,它与这些转义字符一起存储
  • 您包含的两个示例都不是 JSON。他们都假装是 JSON。这就是你无法解析它的原因。

标签: json json.net deserialization


【解决方案1】:

您能否使用原生String 方法中的.replace 将所有双双引号替换为单个双引号。

【讨论】:

  • 这将破坏 JSON 中任何合法的空字符串。
  • 我同意@Lithis 。它会替换整个字符串,以后我无法反序列化字符串。
  • 永远不应该有“合法的”空字符串。而不是浪费带宽传输“这里什么都没有,hoot”只是不包含具有空值的元素,解析后它将具有空值。
【解决方案2】:

你不能。

假设用户能够创建名为", "x": "y 的产品。这将表示为(错误地序列化为)

"Details": {
    "Product": "", "x": "y",
    "cost": 150.0
}

这是有效的 JSON,因此没有语法方法可以检测出任何错误。

更糟糕的是,如果攻击者创建了一个名为 ", "cost": 1.0, "x": "y 的产品会怎样。这将表示为(应用了一些格式)

"Details": {
    "Product": "",
    "cost": 1.0,
    "x": "y",
    "cost": 150.0
}

你的反序列化器会用它做什么?它会接受吗? (有些会。)它会使用第一个"cost" 还是第二个"cost"——也就是说,它会允许攻击者降低成本吗?攻击者是否有可能在真实的"cost" 之后创建一个重复的"cost"?即使在反序列化该字符串时一切正常,升级到新版本的库后它会继续工作吗?

截至 2017 年,Json.net 接受此类 JSON 并使用第二个重复值(请参阅Json.net no longer throws in case of duplicate)。但是这种行为在版本 6 和 8 之间发生了变化。它会再次改变吗?

唯一真正的修复是修复生成此 JSON 的任何内容。

【讨论】:

    【解决方案3】:

    您的示例中的内容不是 JSON; 这就是为什么您在使用 JSON 解析器解析它时遇到问题的原因。

    考虑修复数据的存储方式或读取方式。

    选项 1:修复它的存储方式。
    看起来像字符串值"blammy" 实际上存储在您的数据库中,例如:\"blammy\"。 这是零正确的。 存储在 DB 列中的值应该是 blammy (注意,没有引号)。 解决这个问题。

    选项 2:修复读取方式
    有些东西正在从您的数据库中读取列值。 更改该内容以从字符串数据中删除外部双引号。 然后, (不正确的)存储值\"blammy\" 将是 读取(并固定)为blammy。 这仅适用于您问题中的示例 1。 如果您获得示例 2,您将需要做其他事情。

    【讨论】:

    • 感谢@DwB 的回复。在使用 .Replace(@"\"\""", "\"") 阅读该行后,我可以处理我的代码中的第一种情况。真正的问题在于第二种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2013-05-07
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多