如何使用额外的“”

时间:2019-02-11 22:31:25

标签: json json.net deserialization

我输入了要反序列化的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",这是可以预期的。有什么方法可以反序列化这种字符串吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

您能否使用本机.replace中的String来将所有双双引号替换为一个双引号。

答案 1 :(得分:0)

你不能。

假设用户能够创建名为", "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"之后创建重复的import matplotlib as mpl import matplotlib.pyplot as plt import mpl_toolkits.mplot3d as a3 import numpy as np import scipy as sp from scipy import spatial as sp_spatial def icosahedron(): h = 0.5*(1+np.sqrt(5)) p1 = np.array([[0, 1, h], [0, 1, -h], [0, -1, h], [0, -1, -h]]) p2 = p1[:, [1, 2, 0]] p3 = p1[:, [2, 0, 1]] return np.vstack((p1, p2, p3)) def cube(): points = np.array([ [0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1], ]) return points points = icosahedron() # points = cube() hull = sp_spatial.ConvexHull(points) indices = hull.simplices faces = points[indices] print('area: ', hull.area) print('volume: ', hull.volume) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.dist = 30 ax.azim = -140 ax.set_xlim([0, 2]) ax.set_ylim([0, 2]) ax.set_zlim([0, 2]) ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('z') for f in faces: face = a3.art3d.Poly3DCollection([f]) face.set_color(mpl.colors.rgb2hex(sp.rand(3))) face.set_edgecolor('k') face.set_alpha(0.5) ax.add_collection3d(face) plt.show() ?即使当前反序列化该字符串时一切正常,升级到新版本的库后,它仍可以继续工作吗?

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

唯一真正的解决方法是修复生成此JSON的所有内容。

答案 2 :(得分:0)

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

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

选项1:修复其存储方式。
看起来像字符串值"blammy" 实际上以\"blammy\"之类的形式存储在您的数据库中。 这是零正确率。 存储在数据库列中的值应为blammy (注意,无引号)。 解决该问题。

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