JSON.Net 反序列化包含特殊字符的字符串

6
如何解析包含特殊字符的JSON字符串?
JObject obj = JObject.Parse(str);

字符串数值:

{
  "message": "some !@#$%^&*(){}:"?/?/|"':>;><{"d":"v"}"
}

我遇到了异常:在解析一个值时,遇到了意外的字符:{。

2个回答

12

这个JSON是无效的。如果一个JSON字符串包含特殊字符,比如双引号"、反斜杠\或斜杠/,它们需要用反斜杠\进行转义。(请参见JSON.org。)任何JSON解析器,包括Json.Net,都无法处理格式不正确的JSON字符串。

您的JSON需要像这样才能被正确解析:

{
  "message": "some !@#$%^&*(){}:\"?/?/|\"':>;><{\"d\":\"v\"}"
}

解决方案是在源头正确地对字符串进行序列化。


还有许多其他特殊符号,例如花括号等等...需要一些由JSON.NET库支持的统一解决方案。 - ohavryl
如果JSON是使用JSON序列化器(例如Json.Net中的JsonConvert.SerializeObject())创建的,则所有特殊字符都将被正确转义。然后该字符串将能够被解析。 - Brian Rogers
用户手动输入JSON。他可以输入任何符号作为消息值。 - ohavryl
用户输入整个JSON还是只输入消息?如果只输入消息,则可以将消息放入对象并进行序列化,而序列化程序将处理转义。如果用户输入整个JSON,则他们需要负责转义。您需要在接受之前验证它是否正确。一种方法是尝试在try / catch中反序列化JSON。如果捕获异常,则说明JSON无效。 - Brian Rogers
我同意这一点,但用户输入整个JSON。 - ohavryl

2

将您的JSON数据使用.stringify()方法转换为字符串。

{
  "message": JSON.stringify("your text here")
}

如果您的ASP.NET MVC视图中包含原始数据,可以按照以下方式进行操作:
{
  "message": JSON.stringify("@Html.Raw(HttpUtility.JavaScriptStringEncode(Model.MyString))")
}

您也可以尝试更受欢迎的方式:

JSON.stringify({ "message" : message });

客户端方面一切都很好。我需要一个服务器端的解决方案。 - ohavryl
4
@ohavryl,实际上您正在尝试从客户端传递损坏的JSON。因此,我认为最好的方法是修复JavaScript代码。 - Roman Pushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接