我试图反序列化作为服务响应收到的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的解码函数?
它看起来像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);
}
例;
var item = CleanJson<ModelItem>(jsonString);
我建议给服务器管理员/网站管理员写电子邮件,并要求他们用json解决这个问题。
但是如果这是不可能的,你可以编写简单的解析,在双引号内找到非扩展的双引号并转义它们。它几乎不会超过20行代码。
你可以使用newtonsoft库将它转换为object(替换\“with”):
dynamic o = JObject.Parse(jsondata);
return Json(o);