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 正确序列化它,您需要在列表内的列表中创建一个双精度数组/列表。我什至不想开始编写代码来为其添加值。顺便说一句,JsonConverter 对数组和列表的处理方式相同,我选择使用列表是因为我不知道数组的语法是什么(我认为它不存在)。

无论如何,您的自定义转换器可能是更好的方法。它更干净,更有意义。试图填充该列表只会让人头疼。

于 2013-05-29T23:47:19.813 回答