首页 > 解决方案 > 如何像基类一样序列化属性?

问题描述

我有一个这样的对象:

[JsonObject]
public class Thing<T> where T: class
{
    [JsonProperty()]
    T Data { get; set; }

    [JsonProperty("error")]
    public int ErrorCode { get; set; }
}

有没有办法让它序列化它,以便它给出这样的东西,例如,当T一个类具有单个属性时:

{ value: "content", error: 1 }

而不是这个:

{ data: { value: "content" }, error: 1 }

我很遗憾不能从数据类派生。

标签: c#jsonpropertiesjson.netdeserialization

解决方案


您将需要一个自定义转换器,例如:

[JsonConverter(typeof(HasValueConverter))]
public class HasValue
{
    public HasValue(string value)
    {
        this.Value = value;
    }

    public string Value { get; set; }
}

[JsonObject]
public class Thing<T> where T: class
{
    [JsonProperty("value")]
    public T Data { get; set; }

    [JsonProperty("error")]
    public int ErrorCode { get; set; }
}

class HasValueConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(HasValue);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return new HasValue(JToken.Load(reader).Value<string>());
    }

    public override bool CanWrite => false;

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

[Test]
public void Deserializes()
{
    var json = "{ value: \"content\", error: 1 }";
    var thing = JsonConvert.DeserializeObject<Thing<HasValue>>(json);
    Assert.AreEqual("content", thing.Data.Value);
}

推荐阅读