首页 > 解决方案 > 行分隔符 '\u2028' 使用 json.net 解析不正确

问题描述

static void Main(string[] args)
{
    var newLineChar = Char.Parse("\u2028");
    var jsonStr = @"{""value"":""some chars " + newLineChar + @"""}";

    var jObject = Newtonsoft.Json.Linq.JObject.Parse(jsonStr);

    var jsonStrAfterParse = jObject.ToString(Newtonsoft.Json.Formatting.None);
}

我有一个 JSON 字符串,如:

"{\"value\":\"一些字符 \u2028\"}"

在我尝试使用 Newtonsoft.Json 解析它之后,我得到了 JSON:

"{\"value\":\"一些字符 \\u2028\"}"

行分隔符字符“\u2028”被解析为“\\u2028”。我无法确定是否有任何其他字符有同样的问题。有人能帮忙吗?谢谢。

即时窗口中的图片

文本可视化器中的 jsonStr

文本可视化器中的 jsonStrAfterParse

标签: c#json.net

解决方案


在评论中,您确定这是预期的行为,但我想我会根据源代码解释原因

由于未转义的控制字符,您的输入字符串不是有效的 JSON \u2028,但是 NewtonSoft.Json 正在优雅地处理错误的输入,并\\u2028在您要求它为您序列化时给出正确的输出。

对于反序列化,你没有逃避它并不关心。它只是继续并将其包含在您的字符串中。没什么大不了的。

但是当你要求它为你序列化字符串时.ToString(Newtonsoft.Json.Formatting.None)——这是一种 Newtonsoft 扩展方法——它的工作是为你提供有效的 JSON,天哪,这就是它要做的,给你\\u2028你看到的。


推荐阅读