我目前正试图解决我们正在尝试反序列化的无效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
实现示例,因为实际上没什么可展示的。只是我试图使用任何“读取......”方法而没有这样做。
答案 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上使用它。