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

时间:2015-06-23 13:48:27

标签: c# json json.net

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

  

解析值时遇到意外的字符:s。路径' type.id',第1行,第12位。

这是因为输入字符串不是正确形成的json字符串,我明白了。但是,问题是字符串永远不会是格式正确的json字符串而我无法更改,但仍然需要将其反序列化为对象。

字符串:

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

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

3 个答案:

答案 0 :(得分:0)

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

您可以使用http://jsonformatter.curiousconcept.com/查看错误。

字符串和属性名称应包含在'或'“

答案 1 :(得分:0)

如果你不能回到你的数据源并在那里修复它,你可以尝试修复你的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

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

答案 2 :(得分:0)

我会使用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 = ...

如果使用正则表达式感觉很好,https://xkcd.com/208/:)