我试图使用JsonConvert将字符串反序列化为对象,但我得到了异常:
解析值时遇到意外的字符:s。路径' type.id',第1行,第12位。
这是因为输入字符串不是正确形成的json字符串,我明白了。但是,问题是字符串永远不会是格式正确的json字符串而我无法更改,但仍然需要将其反序列化为对象。
字符串:
"{type: {id: schoolType1516,req: true,edit: yes},name: {id: schoolName1516,req: true,edit: yes}}"
如何将此字符串转换为格式正确的json字符串,以便可以使用JsonConvert将其反序列化为对象?
答案 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/:)