我可以通过一种方法在序列化(牛顿)中构建对象json吗?

时间:2018-09-02 13:00:58

标签: c# .net json serialization .net-core

我有一个基本摘要

public abstract class absBase
{
    public int A {get;set;}
    public string B {get;set;}
    public abstract string Generate()
}

public class FirstClass : absBase
{
    public override string Generate()
    {
          //Mapping of certain properties and some calcs
          return ObjectRepresentationInStringOrObject;
    }
}

现在我想做的是

 var a = new FirstClass();
 string jsonRep = JsonConvert.Serialize(a);

并让jsonRep是从Generate()返回的字符串。 这个想法是建立一个对象树来进行序列化,但是叶子会像我想要的那样生成。 我已经在实现GetObjectData并调用Generate抽象方法的根对象中尝试过ISerializeable,但从未调用它,只是返回对象的属性。

1 个答案:

答案 0 :(得分:4)

为该类型创建一个自定义转换器,该转换器将调用所需的成员

public class AbsBaseConverter : JsonConverter {

    public override bool CanRead {
        get {
            return false;
        }
    }

    public override bool CanConvert(Type objectType) {
        return objectType.IsAssignableFrom(typeof(absBase));
    }

    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) {
        var obj = (absBase)value;
        var json = obj.Generate();
        writer.WriteRaw(json);
    }
}
对于所有派生类型的objectType.IsAssignableFrom(typeof(absBase))CanConvert方法中的

absBase将返回true。

接下来,相应地装饰基本类型

[JsonConverter(typeof(AbsBaseConverter))]
public abstract class absBase {
    public int A { get; set; }
    public string B { get; set; }
    public abstract string Generate();
}

以及致电时

var a = new FirstClass();
string jsonRep = JsonConvert.SerializeObject(a);

转换器在序列化时将调用Generate成员。