我目前正在尝试解决一种情况,即我们试图反序列化无效的Json。关键是我们提供了Json,其中属性赋值是用=
而不是:
字符声明的。
示例Json:
{
"Field1" = "Hello",
"Field2" = "Stuff",
"Field3" = "I am non-Json Json, fear me",
"Field4" = 8
}
有人有幸使用Json.Net将其反序列化为一个将结构关联到C#中的对象吗?其中使用的是=
而不是:
我一直试图编写一个JsonConverter
来读取=
,但它总是抱怨它得到了=
而不是:
,并引发异常,消息为"预期的":"但得到的:=.Path"。
除了编写自己的反序列化过程和不使用Json.Net库之外,我看不出有任何方法可以克服这一点。对于如此接近有效的东西来说,这很糟糕Json(但我认为这是公平的,因为它是无效的)
当reader.ReadAsString();
被击中时,它应该读出Field1
,但显然它还没有遇到它的朋友:
,所以它开始摔倒,说"这到底在这里做什么?!"。我没有任何JsonConverter
实现示例,因为实际上没有太多内容可展示。只有我试图使用任何"读取…"方法,但没有这样做。
如果属性赋值是用=
而不是:
字符声明的,则它不是JSON。
如果你不希望在对象的值中有任何=,那么你可以进行
string json = invalidData.Replace("=", ":");
然后尝试解析它。
正如@冰泡菜提到的,这样做有风险。
我的答案是一个快速修复/解决方法,但您最终需要确保接收到的数据是有效的JSON。
尝试反序列化无效的JSON是没有意义的。
正如其他人所建议的,解决这个问题的最简单方法是在解析JSON字符串之前,使用简单的字符串替换将JSON字符串中的=
字符更改为:
。当然,如果您的任何数据值中包含=
字符,它们也会被替换所破坏。
如果您担心数据中会有=
字符,您可以更进一步,使用Regex进行替换。例如,以下Regex将仅替换紧跟在引用的属性名称后面的=
字符:
string validJson = Regex.Replace(invalidJson, @"(""[^""]+"")s?=s?", "$1 : ");
Fiddle:https://dotnetfiddle.net/yvydi2
另一个可能的解决方案是更改Json.Net源代码,以允许=
,其中:
通常出现在有效的Json中。就解析而言,这可能是最安全的选择,但需要付出更多的努力。如果你想走这条路,请从GitHub下载最新的源代码,并在Visual Studio 2015中打开解决方案。在项目的根目录中找到JsonTextReader类。这个类中有一个名为ParseProperty
的私有方法。方法的末尾是一些代码,看起来像这样:
if (_chars[_charPos] != ':')
{
throw JsonReaderException.Create(this, "Invalid character after parsing property name. Expected ':' but got: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos]));
}
如果您将上述if
语句更改为:
if (_chars[_charPos] != ':' && _chars[_charPos] != '=')
则读取器将允许CCD_ 24和CCD_。保存更改,重新构建库,您应该能够在"特殊"JSON上使用它。