所以,我有一些JSON我正在反序列化。请记住,我无法控制我收到的数据;我只需要尽我所能地使用它。使用JSON.NET进行反序列化 - 如何处理两种可能类型的名称?
有人会相当好,直到我在那里的项目(以下"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的两个子类只能在正确的情况下得到应用...)
编辑:我宁愿达到期望的结果作为反序列化过程的一部分,没有preprcossing字符串(不过,如果没有其他的方式,我会去那里,我猜...)
我使用C#,单声道,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
}
那么,这确实是一个解决方案。如果可能的话,我想避免预处理字符串。 – 2012-07-24 11:51:37
接受,因为我最终不得不这样做。 – 2012-11-02 01:43:40