Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Json.NET:带双引号的反序列化_C#_Json_Double Quotes_Json.net - Fatal编程技术网

C# Json.NET:带双引号的反序列化

C# Json.NET:带双引号的反序列化,c#,json,double-quotes,json.net,C#,Json,Double Quotes,Json.net,我正在尝试反序列化作为服务响应接收的json字符串。客户端是Windows Phone 7,使用C#。我使用deserializor将Json字符串直接转换为对象。但有时Json字符串包含一些注释信息,其中包含双引号(“),反序列化程序失败并抛出错误。根据定义,这是一个无效的Json字符串 如何处理这样的Json字符串。如果它是(\”),则它可以工作。但我不能用(\)替换所有(“),因为json字符串的其他部分可能会有双引号。Json.Net有解码功能吗?我建议您向服务器管理员/网站管理员发送电

我正在尝试反序列化作为服务响应接收的json字符串。客户端是Windows Phone 7,使用C#。我使用deserializor将Json字符串直接转换为对象。但有时Json字符串包含一些注释信息,其中包含双引号(“),反序列化程序失败并抛出错误。根据定义,这是一个无效的Json字符串


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

我建议您向服务器管理员/网站管理员发送电子邮件,让他们用Json解决这个问题


但如果这是不可能的,您可以编写简单的解析,在doublequotes中查找未替换的doublequotes并转义它们。它几乎不会超过20行代码。

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

HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(yourObject))
只要做:

yourJsonString = yourJsonString.Replace("\"", "\\u022");
object o = JSonConvert.Deserialize(yourJsonString);
\u022是双引号的ascii码。因此,替换\u022的引号将被浏览器识别

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


干杯

我也遇到了同样的问题,我找到了一个可能的解决办法。其思想是捕获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);
            }               
        }

我希望你喜欢。

你可以改进它

    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);
    }
static private T CleanJson(字符串jsonData)
{
var json=jsonData.Replace(“\t”,”).Replace(“\r\n”,”);
var循环=真;
做
{
尝试
{
var m=JsonConvert.DeserializeObject(json);
循环=假;
}
捕获(JsonReaderException ex)
{
var位置=ex.LinePosition;
var invalidChar=json.Substring(位置-2,2);
invalidChar=invalidChar.Replace(“\”,“”);
json=$“{json.Substring(0,位置-1)}{invalidChar}{json.Substring(位置)}”;
}
}while(loop);
返回JsonConvert.DeserializeObject(json);
}
榜样

var item = CleanJson<ModelItem>(jsonString);
var item=CleanJson(jsonString);

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


尝试使用自定义反序列化这篇文章可能会帮助您[如何在反序列化之前将json对象转换为自定义类型?][1][1]:嗨,你能帮我提一下你的建议吗?你说的是正则表达式吗?写出那些行会受到很多人的欢迎。这是一个很好的解决方案。这应该被认为是正确的答案。
var item = CleanJson<ModelItem>(jsonString);
dynamic o = JObject.Parse(jsondata);
return Json(o);