Как десериализовать объект с информацией о типе вне себя - PullRequest
0 голосов
/ 01 марта 2019

У меня есть тип Parent, одно из его полей - Discriminated Union (JsonSubTypes). В моем примере ниже я сохраняю Discriminant (id) внутри моего дочернего поля.То, что я хочу знать: возможно ли иметь discriminant вне моего child объекта и непосредственно в родительском объекте?

Что работает

public class Parent{
    Child childField{get;set;}
}

[JsonConverter(typeof(JsonSubTypes),CHILDTYPE)]
[JsonSubTypes.KnownSubTypes(typeof(Child1),CTYPE.Child1)]
[JsonSubTypes.KnownSubTypes(typeof(Child2),CTYPE.Child2)]
public abstract class Child{

    public enum Discriminator{
        Child1=0,
        Child2=1
    }

    private const string CHILDTYPE="childType";

    [JsonProperty(CHILDTYPE)]
    public abstract  Discriminator Kind{get;} //i want this moved to parent

}
public class Child1:Child{
    public int Value{get;set;}
    public override Kind=>Discriminator.Child1;
}
public class Child2:Child{
    public bool Value{get;set;}
    public override Kind=>Discriminator.Child2;
}

Использование

List<Parent>parents=new List<Parent>{new Child1{Value=3},new Child2{Value=True}};
var str=JsonConvert.SerializeObject(parents);
List<Parent>parents=JsonConvert.DeserializeObject<List<Parent>(str);

Что я хочу

 public class Parent{

        private const string CHILDTYPE="childType";

        public enum Discriminator{
         Child1=0,
         Child2=1
        }


        public abstract Discriminator Kind{get;} 

        Child childField{get;set;}
    }

[JsonConverter(typeof(JsonSubTypes),CHILDTYPE)]
[JsonSubTypes.KnownSubTypes(typeof(Child1),CTYPE.Child1)]
[JsonSubTypes.KnownSubTypes(typeof(Child2),CTYPE.Child2)]
public abstract class Child
{

}

Как вы можете видеть, что я хочу, чтобы переместить мое Kind поле из Child и в Parent. Могу ли я как-нибудь это сделать?Я хочу сохранить все то же самое, просто вместо Json, как это:

{
    childField:{ Kind:3}
}

Мне нужно разместить для JSON, как это:

 {
    Kind:3
    childField:{}
}

Могу ли я сделать это?Могу ли я как-то украсить родителя, чтобы знать, как десериализовать одно из его полей на основе другого?

...