だから、私はデシリアライズしているJSONをいくつか持っています。取得しているデータを制御できないことに注意してください。私はできる限りそれを処理する必要があります。
"z"
アイテム(以下)が同じアイテムタイプ内の2つの異なるタイプ("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 の 2 つのサブクラスなど、同等のもの...)
編集:文字列を事前処理せずに、逆シリアル化プロセスの一部として目的の結果を達成したいと思います(ただし、他に方法がない場合は、そこに行くと思います...)
私は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
}