使用无效标记反序列化Json



我目前正在尝试解决一种情况,即我们试图反序列化无效的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上使用它。

相关内容

  • 没有找到相关文章

最新更新