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

问题描述 投票:1回答:1

我有一个基础摘要

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的根对象中尝试了ISerializeable并调用了Generate抽象方法,但它从未调用过,只是返回对象的属性。

c# .net json serialization .net-core
1个回答
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成员。

© www.soinside.com 2019 - 2024. All rights reserved.