我输入了要反序列化的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"
,这是可以预期的。有什么方法可以反序列化这种字符串吗?
谢谢!
答案 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,则需要做其他事情。