C# Json.NET:带双引号的反序列化
我正在尝试反序列化作为服务响应接收的json字符串。客户端是Windows Phone 7,使用C#。我使用deserializor将Json字符串直接转换为对象。但有时Json字符串包含一些注释信息,其中包含双引号(“),反序列化程序失败并抛出错误。根据定义,这是一个无效的Json字符串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字符串。如果它是(\”),则它可以工作。但我不能用(\)替换所有(“),因为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);