[英]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.