3

いくつかのフラグを含む JSON 応答があります。

{"df":1,"dr":0,"pf":0,"pr":0,"ft":0,"rt":1}

これをフラグ列挙にデシリアライズしたい:

public class Foo {
    public Doors Doors { get; set; }
    public Trunk Trunks { get; set; }
}

df、dr、pf、pr は Doors flags enum にデシリアライズする必要がありますが、ft、rt は Trunks に入る必要があります。これが決定を下すためのカスタムコードであると期待しています。私が探しているのは、私が言うことを可能にするものです:

[JsonProperty("df,dr,pf,pr"), JsonConverter(typeof(DoorsConverter))]
public Doors Door { get; set; }

これにより、これらの値に基づいてプロパティの構築を処理できます。このタイプのものは存在しますか、それとも個々のプロパティを非公開フィールドにプッシュし、事後にプロパティを構築することに行き詰まっていますか?

4

2 に答える 2

0

最近 JSON.NET に追加されたのは、WCF データ コントラクトで得られるものと同様の拡張データ コンセプトです。これで、それを処理するための追加のプロパティとメソッドを追加できます。

[JsonExtensionData]
public IDictionary<string, JToken> ExtensionData;

[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
    Doors = ExtensionData.ContainsKey("df") && Convert.ToBoolean(Convert.ToInt16(ExtensionData["df"]))
        ? Doors | Door.DriverSideFront
        : Doors & ~Door.DriverSideFront;
    Doors = ExtensionData.ContainsKey("dr") && Convert.ToBoolean(Convert.ToInt16(ExtensionData["dr"]))
        ? Doors | Door.DriverSideRear
        : Doors & ~Door.DriverSideRear;
    Doors = ExtensionData.ContainsKey("pf") && Convert.ToBoolean(Convert.ToInt16(ExtensionData["pf"]))
        ? Doors | Door.PassengerSideFront
        : Doors & ~Door.PassengerSideFront;
    Doors = ExtensionData.ContainsKey("pr") && Convert.ToBoolean(Convert.ToInt16(ExtensionData["pr"]))
        ? Doors | Door.PassengerSideRear
        : Doors & ~Door.PassengerSideRear;

    Trunks = ExtensionData.ContainsKey("ft") && Convert.ToBoolean(Convert.ToInt16(ExtensionData["ft"]))
        ? Trunks | Trunk.Front
        : Trunks & ~Trunk.Front;
    Trunks = ExtensionData.ContainsKey("rt") && Convert.ToBoolean(Convert.ToInt16(ExtensionData["rt"]))
        ? Trunks | Trunk.Rear
        : Trunks & ~Trunk.Rear;

    ExtensionData.Remove("dt");
    ExtensionData.Remove("dr");
    ExtensionData.Remove("pf");
    ExtensionData.Remove("pr");
    ExtensionData.Remove("ft");
    ExtensionData.Remove("rt");
}

これは、読み取りシナリオに適しています。書き込みシナリオと、それがどのように変化するかについては調べていません。

于 2013-08-05T21:00:28.693 に答える