从同一JSON属性序列化和反序列化为不同的对象属性

时间:2018-04-19 09:43:29

标签: c# json.net

我想将类中的属性序列化为json属性,当反序列化时,我想将其读取到不同的属性。

无法弄清楚如何在json.net中实现这一目标

最小例子:

Backend将特殊格式的json属性转换为数字时间戳(firebase systemtimestamp)。

我想对序列化和反序列化使用相同的抽象基类。

  • 序列化时,我需要生成"时间戳"具有特殊值的json属性。
  • 反序列化时,传入的json在" timestamp"中包含一个数字。属性。我显然需要将它读入不同的类属性。

类别:

[JsonObject(MemberSerialization.OptIn)]
public abstract class ItemBase
{
    [JsonProperty("timestamp")]
    private TimestampModel WriteTimestamp => TimestampModelInstance;

    [JsonProperty("timestamp")]
    private long ReadTimestamp { get; set; }

    public DateTime Timestamp => DateTimeOffset.FromUnixTimeMilliseconds(ReadTimestamp).LocalDateTime;
}

我需要以某种方式将WriteTimestamp标记为"仅序列化"和ReadTimestamp为"仅反序列化"

1 个答案:

答案 0 :(得分:0)

如果有人发现这有用,我使用自定义JsonConverter解决了该问题。

这样我只有一个具有读取值类型(long)的类属性,无论实际值如何,它总是序列化为TimestampModelInstance(特殊的firebase结构)

转换器:

public class TimestampConverter : JsonConverter
{
    public override bool CanRead => false;

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        JObject.FromObject(TimestampModelInstance).WriteTo(writer);
    }
}

在课堂上:

[JsonProperty("timestamp")]
[JsonConverter(typeof(TimestampConverter))]
private long NumericTimestamp { get; set; }

public DateTime Timestamp => 
DateTimeOffset.FromUnixTimeMilliseconds(NumericTimestamp).LocalDateTime;