使用JSON.NET进行反序列化-如何处理两种可能类型的一个名称



所以,我有一些JSON正在取消序列化。请记住,我无法控制我正在获取的数据;我只需要尽我所能去处理它。

它进行得相当顺利,直到我遇到一个问题,在一个项目(下面的"z")中,同一项目类型中可以有两个不同的类型(参见"z":[]"z":{})(在我处理的数据中,things在取消序列化后应该被视为Dictionary<string, FooType>…)。

{
"things":{
    "1":{
        "x":123.45,
        "y":678.90,
        "z":{
                "2":true
            },
        "a":[
                1,
                2
            ]
        },
    "2":{
        "x":1414.23,
        "y":5656.78,
        "z":[
                true
            ],
        "a":[
                3
            ]
        }
    }
}

我很确定这是一个输出错误(即源在生成"z":[true]时应该生成"z":{"0":true}),因为这就是稍后在应用程序中解释"z":[true]的方式。然而,正如我所说,我无法控制数据,这个问题不太可能很快得到解决。

我曾尝试为每个成员变量设置一个成员变量,但命名冲突(使用[DataContract(Name="z")])会导致异常(这并不奇怪)。

如何将两种类型的"z"读取为一个通用的FooType?(或者等效的,比如一个常见FooParentType的两个子类,它们只在正确的情况下应用…)

编辑:作为去序列化过程的一部分,我更希望在不预编码字符串的情况下实现所需的结果(尽管如果没有其他方法,我想我会去那里…)

我使用C#、Mono、JSON.NET,并使用类似的代码(pastebin上的可编译版本):

string jsonString = "{"things":{"1":{"x":123.45,"y":678.9,"z":{"2":true},"a":[1,2]},"2":{"x":1414.23,"y":5656.78,"z":[true],"a":[3]}}}";
RootType rt = JsonConvert.DeserializeObject<RootType>(jsonString);

带类别:

[DataContract]
class RootType
{
    [DataMember(IsRequired = true)]
    public Dictionary<string, FooType> things { get; set; }
}
[DataContract]
class FooType
{
    [DataMember(IsRequired = true)]
    public double x { get; set; }
    [DataMember(IsRequired = true)]
    public double y { get; set; }
    [DataMember(IsRequired = true)]
    public List<int> a { get; set; }
    // List<bool> zList and Dictionary<string, bool> zDict each only work for one case
    // but not the other, and having both causes a naming conflict
}

我遇到了类似的问题,在反序列化之前,我只是通过string.replace函数运行字符串来"更正"数据。

最新更新