使用无效标记反序列化Json

时间:2016-06-07 13:40:12

标签: c# json.net

我目前正试图解决我们正在尝试反序列化的无效Json的情况。关键点是我们向Json提供了使用=而不是:字符声明属性赋值的地方。

示例Json:

{
    "Field1" = "Hello",
    "Field2" = "Stuff",
    "Field3" = "I am non-Json Json, fear me",
    "Field4" = 8
}

有没有人幸运使用Json.Net将其反序列化为一个将结构与C#相关联的对象,而=正在使用而不是:

我一直试图写一个JsonConverter来阅读=,但它总是抱怨它有一个=而不是:并抛出异常消息“预期':'但得到:=。路径''”。

除了编写自己的反序列化过程而不使用Json.Net库之外,我没有看到任何方法。这对于有效的Json来说很糟糕(但我认为这是公平的,因为它是无效的)

reader.ReadAsString();被点击时,它应该显示Field1,但很明显它还没有遇到它的朋友:,所以继续贬低说“这到底是做什么的这里?!”。我没有任何JsonConverter实现示例,因为实际上没什么可展示的。只是我试图使用任何“读取......”方法而没有这样做。

2 个答案:

答案 0 :(得分:2)

如果使用=而不是:字符声明属性赋值,则它不是JSON。

如果您不希望对象的值中有任何=,那么您可以执行

string json = invalidData.Replace("=", ":");

然后尝试解析它。

如@Icepickle所述,这样做存在风险。

我的回答可以作为快速修复/解决方法,但您最终需要确保您收到的数据是有效的JSON。

尝试反序列化无效的JSON没有意义。

答案 1 :(得分:2)

正如其他人所建议的,解决此问题的最简单方法是在解析JSON字符串之前使用简单的字符串替换将=个字符更改为:。当然,如果您有任何数据值包含=个字符,那么替换它们也会受到损坏。

如果您担心数据中会包含=个字符,您可以更进一步,并使用Regex进行替换。例如,以下正则表达式只会替换紧跟引用属性名称的=个字符:

string validJson = Regex.Replace(invalidJson, @"(""[^""]+"")\s?=\s?", "$1 : ");

小提琴:https://dotnetfiddle.net/yvydi2

另一种可能的解决方案是更改Json.Net源代码,以允许= :通常出现在有效的JSON中。这可能是解析方面最安全的选择,但需要更多努力。如果您想要使用此路由,请从GitHub下载最新的source code,然后在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] != '=')

然后读者将允许:=个字符作为属性名称和值之间的分隔符。保存更改,重建库,您应该能够在“特殊”JSON上使用它。