2

所以,我有一些我正在反序列化的 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
}
4

1 回答 1

1

我有一个类似的问题,只是通过 string.replace 函数运行字符串,以在反序列化之前“更正”数据。

于 2012-07-24T11:50:21.803 回答