9

我正在尝试反序列化作为服务响应接收到的 json 字符串。客户端是 C# 中的 Windows Phone 7。我正在使用Json .NET - James Newton-King deserializor 将 Json 字符串直接转换为对象。但有时 Json 字符串包含一些带有双引号 (") 的注释信息,反序列化器会失败并抛出错误。根据Jsonlint看起来这是一个无效的 Json 字符串。

{
    "Name": "A1",
    "Description": "description of the "object" A1"
}

如何处理这样的 Json 字符串。如果是 (\"),那么它可以工作。但我不能用 (\") 替换所有 ("),因为 json 字符串的其他部分可能有双引号。Json .Net 有任何解码功能吗?

4

6 回答 6

13

看起来 HttpUtility.JavaScriptStringEncode 可能会解决您的问题。

HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(yourObject))
于 2013-02-08T12:16:56.873 回答
2

做就是了:

yourJsonString = yourJsonString.Replace("\"", "\\u022");
object o = JSonConvert.Deserialize(yourJsonString);

\u022 是双引号的ASCII码。因此,您的浏览器将识别替换 \u022 的引号。

并在 "\u022" 中使用 \ 使 c# 识别反斜杠字符。

干杯

于 2014-01-22T20:35:26.563 回答
2

你可以改进这一点。

    static private T CleanJson<T>(string jsonData)
    {
        var json = jsonData.Replace("\t", "").Replace("\r\n", "");
        var loop = true;
        do
        {
            try
            {
                var m = JsonConvert.DeserializeObject<T>(json);
                loop = false;
            }
            catch (JsonReaderException ex)
            {
                var position = ex.LinePosition;
                var invalidChar = json.Substring(position - 2, 2);
                invalidChar = invalidChar.Replace("\"", "'");
                json = $"{json.Substring(0, position -1)}{invalidChar}{json.Substring(position)}";
            }
        } while (loop);
        return JsonConvert.DeserializeObject<T>(json);
    }

例子;

var item = CleanJson<ModelItem>(jsonString);
于 2019-03-22T14:59:03.220 回答
1

我有同样的问题,我找到了一个可能的解决方案。这个想法是捕捉 JsonReaderException。此异常为您带来属性“LinePosition”。您可以将此位置替换为空字符 (' ')。然后,您递归地使用此方法,直到整个 json 被修复。这是我的例子:

private JToken processJsonString(string data, int failPosition)
        {
            string json = "";
            var doubleQuote = "\"";

            try
            {
                var jsonChars = data.ToCharArray();

                if (jsonChars[failPosition - 1].ToString().Equals(doubleQuote))
                {
                    jsonChars[failPosition - 1] = ' ';
                }

                json = new string(jsonChars);

                return JToken.Parse(json);
            }
            catch(JsonReaderException jsonException)
            {
                return this.processJsonString(json, jsonException.LinePosition);
            }               
        }

我希望你喜欢它。

于 2018-10-25T18:09:08.677 回答
0

我建议给服务器管理员/网站管理员写电子邮件,并要求他们用 json 解决这个问题。

但如果这是不可能的,您可以编写简单的解析,在双引号内找到非转义的双引号并将它们转义。它几乎不会超过 20 行代码。

于 2011-11-13T07:17:43.780 回答
0

您可以使用 newtonsoft 库将其转换为对象(将 \" 替换为 "):

dynamic o = JObject.Parse(jsondata);
return Json(o);
于 2019-07-21T06:34:10.907 回答