Могу ли я построить объект JSON в сериализации (Ньютон) из метода? - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть базовый реферат

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 (). Идея состоит в том, чтобы построить дерево объектов для сериализации, но листья будут сгенерированы точно так, как я хочу. Я пробовал ISerializeable в корневом объекте, который реализует GetObjectData и вызывает абстрактный метод Generate, но он никогда не вызывается и просто возвращает свойства объектов.

1 Ответ

0 голосов
/ 02 сентября 2018

Создайте пользовательский конвертер для типа, который будет вызывать нужный элемент

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 вернет true для всех производных типов absBase.

Затем украсьте базовый тип соответственно

[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 при сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...