正在反序列化格式错误的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将其反序列化为对象?
我会使用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
编辑:将单引号固定为双引号。