在下面的代码片段中,注释掉的jsonString
变量中的JSON字符串是有效的,而注释掉的变量导致JObject.Parse
抛出JsonReaderException
并显示以下消息:
After parsing a value an unexpected character was encountered: e. Path 'Key', line 1, position 15.
var jsonString = "{\"Key\":\"Value \"extra\" \"}";
//var jsonString = "{\"Key\":\"Value \\\"extra\\\" \"}";
JObject.Parse(jsonString);
Newtonsoft.Json或其他地方是否有任何方法可以转换JSON字符串使其有效?
答案 0 :(得分:1)
否,因为NewtonSoft无法猜测您想要什么。例如。是新的密钥,您只是省略了逗号还是它是先前值的一部分,还是仅仅是可以忽略的内容。最好让您从构造有效的json中使用json。
答案 1 :(得分:0)
使用正则表达式可能会帮助您解决现有的JSON。如果您可以控制后续JSON的生成方式,那么您确实应该在此点进行修复。
此解决方案将从a
"key":
之后的第一个“开始,一直到"
或,
之前的最后一个}
之间的值进行计数,然后重新序列化该值,以确保正确转义该值。如果找到",
,则期望该值后跟另一个键("key":
)。这是为了避免出现红色鲱鱼(即{"key": "test "," value"}
),否则可能会造成混淆。
private static string FixJson(string json)
{
var regex = new Regex("\"(?<key>.*?)\"\\W?:\\W?\"(?<value>.*?)\"(?=,\".*?\"\\W?:|}$)");
return regex.Replace(json, new MatchEvaluator(m => {
var key = m.Groups["key"].Value;
var val = m.Groups["value"].Value;
return string.Format("\"{0}\":{1}", key, JsonConvert.SerializeObject(val));
}));
}
免责声明:这是一个正则表达式,并非万无一失,并且,如果您的JSON损坏程度超出您的指示,它可能会吐出损坏的JSON或不正确的值,因此使用此方法后果自负。