【问题标题】:Prevent Newtonsoft JSON deserializer from accepting strings with new lines (enforce strict JSON rules)?防止 Newtonsoft JSON 反序列化器接受带有新行的字符串(强制执行严格的 JSON 规则)?
【发布时间】: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 相同?

标签: c# json json.net


【解决方案1】:

我已经调试了 Newtonsoft Json.NET,但我会说你不能。所有有趣的事情都发生在JsonTextReader 类中,并且没有有用的覆盖点。你感兴趣的路径是Read()->ParseValue()->ParseString()->ReadStringIntoBuffer(),到最后有:

case StringUtils.CarriageReturn:
    _charPos = charPos - 1;
    ProcessCarriageReturn(true);
    charPos = _charPos;
    break;
case StringUtils.LineFeed:
    _charPos = charPos - 1;
    ProcessLineFeed();
    charPos = _charPos;
    break;

这将“接受”字符串中的换行符。

更糟糕的是,甚至没有关于“字符串解析的开始和结束”的可重写方法或事件。

您可以清楚地重写整个 JsonTextReader,但您不能简单地将其复制并粘贴到新文件中,因为它使用 Json.NET 的内部类(如 StringBufferStringReferenceStringUtils、@ 987654338@、ConvertUtilsMiscellaneousUtils(但仅适用于.Assert)加上internalinternal的方法JsonReader...)

请记住,如果您只想检查 Json 是否有效,您可以尝试其他存在的解析器。微软给你两个:有(旧的)JavascriptSerializer 和(新的)JsonSerializer

【讨论】:

猜你喜欢
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
相关资源
最近更新 更多