【问题标题】:JSON.Net deserialize string which contains special charactersJSON.Net 反序列化包含特殊字符的字符串
【发布时间】:2013-12-20 15:31:24
【问题描述】:

如何使用包含特殊字符的值之一解析 JSON 字符串?

JObject obj = JObject.Parse(str);

str值:

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

我得到了执行:解析一个值后遇到了一个意外字符:{.

【问题讨论】:

    标签: c# asp.net-mvc json json.net


    【解决方案1】:

    那个 JSON 是无效的。如果 JSON 字符串包含特殊字符,如双引号 "、反斜杠 \ 或斜杠 /,则需要使用反斜杠 \ 对其进行转义。 (请参阅JSON.org。)任何 JSON 解析器,包括 Json.Net,都无法处理一开始就没有正确格式化的 JSON 字符串。

    您的 JSON 需要如下所示才能被正确解析:

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

    解决办法是在源头正确序列化字符串。

    【讨论】:

    • 还有很多其他特殊符号,比如大括号...需要JSON.NET库支持的统一解决方案
    • 如果 JSON 是 创建 使用 JSON 序列化程序(如 Json.Net 中的 JsonConvert.SerializeObject()),那么所有特殊字符都将被正确转义。然后就可以解析字符串了。
    • 用户手动输入 JSON。他可以在消息值中输入任何符号。
    • 用户输入整个 JSON,还是只输入消息?如果只是消息,那么您可以将消息放入一个对象并序列化它,序列化程序将负责转义。如果用户输入整个 JSON,则他们负责转义。在接受它之前,您需要验证它是否正确。一种方法是尝试反序列化 try/catch 中的 JSON。如果捕捉到异常,则 JSON 无效。
    • 我同意这一点,但用户输入了整个 JSON。
    【解决方案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,实际上您正试图从客户端传递损坏的 json。所以我认为最好的方法是修复 javascript。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多