我有输入 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"
这是意料之中的。有没有办法反序列化这种字符串?
谢谢!
您能否使用本机String
方法中的.replace
将所有双双引号替换为单个双引号。
你不能。
假设用户能够创建一个名为", "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"
之后创建重复?即使反序列化该字符串时当前一切正常,升级到新版本的库后它是否会继续工作?
截至 2017 年,Json.net 接受此类 JSON 并使用第二个重复值(请参阅 Json.net 在重复的情况下不再抛出)。但是此行为在版本 6 和 8 之间发生了变化。它会再次改变吗?
唯一真正的解决方法是修复生成此 JSON 的任何内容。
示例中的内容不是 JSON; 这就是为什么您在使用 JSON 解析器解析它时遇到问题的原因。
考虑修复数据的存储方式或读取方式。
选项 1:修复其存储方式。
它看起来像字符串值"blammy"
实际上存储在您的数据库中,如下所示:"blammy"
. 这是零百分比的正确。 存储在数据库列中的值应blammy
(注意,没有引号)。 修复该问题。
选项 2:修复读取方式
某些内容正在从数据库中读取列值。 更改该内容以从字符串数据中删除外部双引号。 然后 (不正确的)存储值"blammy"
将是 读取(并修复)要blammy
. 这仅适用于您问题中的示例 1。 如果要获得示例 2,则需要执行其他操作。