0

このJson.Net 5.0.5クラスをシリアライズしたい

[JsonObject(MemberSerialization.OptIn)]
public class RingPoint
{
    public double X { get; set; }

    public double Y { get; set; }

    public RingPoint(double x, double y)
    {
        X = x;
        Y = y;
    }

    [JsonProperty(Required = Required.Always)]
    public double[] Location { get { return new[] { X, Y }; } }

    public bool Equals(RingPoint obj)
    {
        return obj != null && obj.X == X && obj.Y == Y;
    }
}

このjson形式に

{"rings":[[[0.0,0.0],[1.0,0.0],[2.0,0.0],[0.0,0.0]]]}

通常のシリアライゼーションは私に

{"rings":[[{"Location":[0.0,0.0]},{"Location":[1.0,0.0]},{"Location":[2.0,0.0]},{"Location":[0.0,0.0]}]]}

カスタムコンバーターを使用するのは非常に簡単ですが、これを行う属性の方法はありますか、またはこれは JsonConverter をいつ使用するかの完璧な例です

public class RingPointConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteStartArray();
        writer.WriteValue(((RingPoint)value).X);
        writer.WriteValue(((RingPoint)value).Y);
        writer.WriteEndArray();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return null;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof (RingPoint);
    }
}
4

1 に答える 1

0

クラスが別の方法で定義されている場合、カスタム コンバーターは必要ありません。クラスは実際には次のようにする必要があります。

public class rings
{
    List<List<List<double>>> rings;
}

これはうんざりです...しかし、デフォルトの JsonConverter が正しくシリアル化するには、リスト内にあるリスト内に double の配列/リストが必要です。それに値を追加するためのコードを書き始めることさえしたくありません。ちなみに、配列とリストは JsonConverter によって同じように処理されます。配列の構文がどうなるかわからないため (存在しないと思います)、リストを使用することにしました。

とにかく、カスタムコンバーターはおそらくより良いアプローチです。よりクリーンで、より理にかなっています。そのリストにデータを入力しようとするのは、お尻の痛みです。

于 2013-05-29T23:47:19.813 に答える