在C#中将字符串转换为有效的JSON

时间:2018-09-13 05:06:27

标签: c# json.net

在下面的代码片段中,注释掉的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字符串使其有效?

2 个答案:

答案 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或不正确的值,因此使用此方法后果自负。

Try it online