C# 使用$type关键字反序列化外部json字符串,该关键字不在开头

C# 使用$type关键字反序列化外部json字符串,该关键字不在开头,c#,json.net,C#,Json.net,我正在反序列化一个外部json字符串(因此无法控制结构)。外部json使用“序列化器”作为鉴别器。我使用var json=str.Replace(“\”序列化程序“\”:\”,“\”$type\”:\”)使其符合json.net如下所示: 问题是,在外部json字符串中,“serializer”不在开头,但所有属性都按字母顺序排序,因此json.net在反序列化时引发异常,因为它仅识别字符串中第一个属性的“$type”关键字 知道如何反序列化吗?正如用户dbc所建议的,在设置中使用Metadat

我正在反序列化一个外部json字符串(因此无法控制结构)。外部json使用“序列化器”作为鉴别器。我使用
var json=str.Replace(“\”序列化程序“\”:\”,“\”$type\”:\”)使其符合json.net如下所示:

问题是,在外部json字符串中,“serializer”不在开头,但所有属性都按字母顺序排序,因此json.net在反序列化时引发异常,因为它仅识别字符串中第一个属性的“$type”关键字


知道如何反序列化吗?

正如用户dbc所建议的,在设置中使用MetadataPropertyHandling.ReadAhead将解决此问题


更多信息:

为什么不按原样反序列化它呢?json看起来怎么样?如果不替换序列化程序字符串会发生什么情况?@Steve在序列化JSON时使用$type关键字包含类型信息,并读取类型信息,以便在反序列化JSON时创建正确的类型。使用多态性时需要使用$type关键字。此处阅读更多信息:使用与源代码相同的json框架。您可以如中所示设置
MetadataPropertyHandling.ReadAhead
。或者,编写如中所示的自定义转换器,或者。是否确实可以这样做?您说过它来自java系统,并且它们的命名约定与c#不同,例如:
com.stackoverflow.etc
作为包名。@AndréSanson-如果它们还编写了一个自定义的
ISerializationBinder
@AndréSanson,它是有效的,我没有使用ISerializationBinder。我将“$type”关键字替换为“serializer”,反之则替换为str.replace(),MetadataPropertyHandling.ReadAhead将提前读取,这意味着如果“serializer”关键字不在第一位就没有问题了(这与从未发生过的情况类似,因为它是按字母顺序排序的,“s”远远不在字母表的开头),如果您感兴趣,请在此处查看: