所以,我有一些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,并使用这样的代码(compilable version on 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
}
答案 0 :(得分:1)
我有一个类似的问题,只是通过string.replace函数运行字符串,以在反序列化之前“纠正”数据。