【问题标题】:Line Separator ‘\u2028’ parse incorrect using json.net行分隔符“\u2028”使用 json.net 解析不正确
【发布时间】:2018-09-05 03:44:24
【问题描述】:
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”。我无法确定是否有任何其他字符有同样的问题。有人能帮忙吗?谢谢。

Pic in immediate window

jsonStr in text visualizer

jsonStrAfterParse in text visualizer

【问题讨论】:

  • 请从即时窗口分享jsonStr 的值。 jsonStrAfterParse 也一样。
  • @mjwills 我添加了几张照片
  • 可以使用\u2028Environment.NewLine 重现此行为。 This 似乎是相关的。
  • 我现在正试图理解这个问题。您是说您希望 \u2028 仍以未编码的字符形式出现在 JSON 字符串中吗?要不然是啥?它正在工作as I expect it to
  • 是的,这似乎是预期的行为。 @erYYer 也检查this answer

标签: c# json.net


【解决方案1】:

在您确定这是预期行为的 cmets 中,但我想我会根据 source code 探讨为什么

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 2012-09-16
    • 1970-01-01
    • 2013-03-04
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多