【发布时间】:2021-01-06 08:11:21
【问题描述】:
Json.Net 在反序列化期间允许在字符串值中添加新行,这违反了 JSON 规范 - 如何防止这种情况并使 JSON.Net 严格执行 JSON 规则?
我们有一些使用 Newtonsoft 解析 JSON 的服务器端代码。同样的JSON似乎无法在javascript中解析,并且mysql的JSON_VALID函数返回0。只是想知道是否有办法让Newtonsoft对反序列化更加严格。例如,这里是运行的代码,它应该抛出异常,因为 JSON 不能在字符串中嵌入新行。
string jsonStr = "{ \"bob\":\"line1\nline2\" }";
var obj = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonStr);
如果您在调试器中查看jsonStr,特别是使用文本可视化工具,您会看到换行符。正如预期的那样,这个确切的字符串被传递给一个实际的 JavaScript 引擎,解析失败:
JSON.parse("{ \"bob\":\"line1\nline2\" }")
VM137:1 Uncaught SyntaxError: Unexpected token
请注意,序列化代码似乎做了“正确”的事情。即在创建输出时转义新行中的斜线。
public class Test
{
public string Name { get; set;}
}
Test t = new Test();
t.Name = "Bob\nFrank";
string jsonOut = Newtonsoft.Json.JsonConvert.SerializeObject(t);
我错过了什么吗?
【问题讨论】:
-
在 C# 中,您编写的声明 jsonStr 和反序列化的两行代码都可以正常工作。不知道解析失败是什么意思。
-
他的意思是 Javascript 解析失败。因为斜线。
-
也许你需要将你的字符串中的“\”转义(把它变成双“\”),否则它将成为JSON源中的换行符,而不是JSON数据.. . 另外,thats 在回复中对此进行了有趣的讨论。
-
可以确认 Json.NET 比 Javascript JSON 更宽容,并且在反序列化期间将接受字符串中的换行符。
-
而且 jsonOut 的字节与 jsonStr 相同?