繁体   English   中英

Json.NET:双引号反序列化

[英]Json.NET: Deserilization with Double Quotes

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

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

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

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

HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(yourObject))

做就是了:

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

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

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

干杯

你可以改进这一点。

    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);

我遇到了同样的问题,我找到了一个可能的解决方案。 这个想法是捕捉 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);
            }               
        }

我希望你喜欢它。

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

dynamic o = JObject.Parse(jsondata);
return Json(o);

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM