Json.NET:使用双引号进行消毒

时间:2011-11-13 03:50:24

标签: c# json double-quotes json.net

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

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

如何处理这样的Json String。如果它是(\“),那么它可以工作。但我不能用(\”)替换所有(“),​​因为在json字符串的其他部分可能有双引号。是否有任何Json .Net的解码函数?< / p>

6 个答案:

答案 0 :(得分:10)

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

HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(yourObject))

答案 1 :(得分:1)

只是做:

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

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

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

干杯

答案 2 :(得分: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);
            }               
        }

我希望你喜欢它。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您可以对此进行改进。

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

答案 5 :(得分:0)

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

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