1

次のように表された日付でJSONデータをサーバーに受信しています:

{
    "startDate": {
        "d": "/Date(1346454000000)/"
    },
    "slots": [
        {
            "d": "/Date(1347058800000)/"
        },
        {
            "d": "/Date(1347145200000)/"
        }
    ]
}

単純なオブジェクトにシリアル化されます。

public class SlotsVm
{
    public DateTime StartDate { get; set; }

    public DateTime[] Slots { get; set; }
}

日付形式が変なので、それを処理するカスタム JsonConverter を作成する必要がありました。逆シリアル化するには、次のようなコードを使用します。

var slotsVm = JsonConvert.DeserializeObject<SlotsVm>(body,
    new CustomDateTimeConverter());

可能であれば、SlotsVm実際に変換を行うコードではなく、クラスでコンバーターを定義する必要があることを望みます。これは、startDate属性を使用するプロパティで可能です。

[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime StartDate { get; set; }

ただしSlots、単純な ではなく配列である は使用できませんDateTime

クラス自体でクラスが必要とするコンバーターを定義できることが私にとって最善です。

[JsonConverters(typeof(CustomDateTimeConverter), ...]
public class PutDealVm
{

}

しかし、これを行う方法はないようです。

解決策を考えられますか?見逃したクラスのコンバーターを定義する方法はありますか? または、配列がその要素ごとに使用する必要があるコンバーターを定義することは可能ですか?

4

1 に答える 1

1

このようなものはどうですか?これはあなたの質問に直接答えないかもしれませんが、CustomDateTimeConverterクラスを再作成するのが面倒だったので、代わりにこれを思いつきました。これは、カスタム コンバーターが必要ないため、おそらくより単純です。

string json = "{\"startDate\": {\"d\": \"/Date(1346454000000)/\"},\"slots\": [{\"d\": \"/Date(1347058800000)/\"},{\"d\": \"/Date(1347145200000)/\"}]}";

SlotsVmDeserialized slotsVmDeserialized =
    JsonConvert.DeserializeObject<SlotsVmDeserialized>(json);

SlotsVm slotsVm = new SlotsVm()
{
    Slots = slotsVmDeserialized.Slots.Select(d => d.Date),
    StartDate = slotsVmDeserialized.StartDate.Date
};

....

public class SlotsVm
{
    public DateTime StartDate { get; set; }
    public IEnumerable<DateTime> Slots { get; set; }
}

public class SlotsVmDeserialized
{
    public DateObject StartDate { get; set; }
    public IEnumerable<DateObject> Slots { get; set; }
}

public class DateObject
{
    [JsonProperty("d")]
    public DateTime Date { get; set; }
}

ここで行ったことは、最初にSlotsVmDeserializedクラスに逆シリアル化され、それらの単一DataObjectおよび IEnumerable を保持するために使用されます。このDateObjectクラスは、基本的に、カスタム コンバーターに対する私の代替/回避策です。[JsonProperty("d")]を削除して名前を変更Dataすることで、属性なしでこれらすべてを実行できたはずDです。

逆シリアル化したら、オブジェクトSlotsVmのプロパティに基づいて新しいオブジェクトを作成しSlotsVmDeserializedます。

于 2012-10-20T05:17:09.597 に答える