正在反序列化格式错误的json字符串

本文关键字:json 字符串 错误 格式 反序列化 | 更新日期: 2023-09-27 17:59:15

我试图使用JsonConvert将字符串反序列化为对象,但我得到了异常:

分析值时遇到意外字符:s。路径"type.id",第1行,位置12。

发生这种情况是因为输入字符串不是一个格式正确的json字符串,我理解这一点。然而,问题是该字符串永远不会是一个格式正确的json字符串,我无法更改该字符串,但尽管如此,我仍然需要将其反序列化为对象。

字符串:

"{type: {id: schoolType1516,req: true,edit: yes},name: {id: schoolName1516,req: true,edit: yes}}"

如何将此字符串转换为格式正确的json字符串,以便使用JsonConvert将其反序列化为对象?

正在反序列化格式错误的json字符串

我会使用Regex.Replace,如下所示:

// Exchange all words with words surrounded by `"`
// ((''w+''s+)*''w+) becomes (('w+'s+)*'w+), ie all words with possible spaces
var match = "((''w+''s+)*''w+)";
// '"$1'" becomes "$1" which is the sequence for replace the first group (ie the one
// we caught above) with the same group but with extra "
var replacement = "'"$1'"";
var correctJSON = Regex.Replace(faultyJSON, match, replacement);
// Parse it.
var obj = ...

如果使用regex感觉不错,https://xkcd.com/208/:)

如果不能返回到数据源并在那里修复它,可以尝试修复JSON字符串。

如果它保持简单,就像在你的例子中一样,你可以选择每个单词并用引号括起来:

//we only need every match once
var matches = Regex.Matches(source, @"'w+")
                   .OfType<Match>()
                   .Select (m => m.Groups[0].Value)
                   .Distinct();
foreach (var match in matches)
{
    source = source.Replace(match, String.Format("'"{0}'"", match));
}
JObject obj = JObject.Parse(source);

示例:http://share.linqpad.net/sartkg.linq

编辑:将单引号固定为双引号。