C # Как десериализовать Json, чтобы базовый объект использовал базовый класс? - PullRequest
0 голосов
/ 10 июня 2018

Мне нужно преобразовать JSON-объект в сущность, у меня много сущностей, и я не хочу писать свой код несколько раз, поэтому я создал базовый класс сущностей и хочу десериализовать в сущность (не зная, какой производныйвызов объекта к базовому объекту).

Могу ли я это сделать?

Это мой базовый класс (это абстрактный класс)

  public abstract class AbstractEntity
{
    EntityState EntityState { get; set; }
    DateTime CreatedDate { get; set; }
    DateTime? ModifiedDate { get; set; }
    string CreatedBy { get; set; }
    string ModifiedBy { get; set; }

    public EntityState getEntityState()
    {
        return EntityState;
    }
    public void SetEntityState(EntityState entityState)
    {
        EntityState = entityState;
    }            
}

Первый энт:

public class TABLE1: AbstractEntity
{
    public TABLE1();

    public string ID{ get; set; }

    public string ADDRESS{ get; set; }
    public virtual ICollection<TABLE2> TABLE2 { get; set; }
}

Второй энт:

public class TABLE2: AbstractEntity
{
    public TABLE2();

    public string ID{ get; set; }

    public string ADDRESS{ get; set; }
    public virtual TABLE1 TABLE1{ get; set; }
}

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Дублированная ссылка, вероятно, является лучшим решением общего назначения:

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

    public override object ReadJson(JsonReader reader,
        Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject item = JObject.Load(reader);
        var type = item["TYPE"].Value<string>();
        switch (type)
        {
            case "TABLE1":
                return item.ToObject<TABLE1>();
            case "TABLE2":
                return item.ToObject<TABLE2>();
            default:
                return null;
        }
    }

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

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

string json = "{\"TYPE\":\"TABLE1\",\"CreatedDate\":\"2018-06-10T08:00:00.000Z\",\"CreatedBy\":\"John\",\"ID\":\"1\",\"ADDRESS\":\"1 Road Street\",\"TABLE2\":[{\"CreatedDate\":\"2018-06-10T08:00:00.000Z\",\"CreatedBy\":\"John\",\"ID\":\"2\",\"ADDRESS\":\"2 Road Street\"}]}";
var settings = new JsonSerializerSettings()
{
    Converters = new List<JsonConverter>()
    {
        new AbstractEntityConverter()
    }
};
var obj = JsonConvert.DeserializeObject<AbstractEntity>(json, settings);

Конечно, вы можете определить свои JsonSettings в центральном месте, чтобы вы моглине нужно писать декларацию каждый раз, когда вы ее используете.

PS Я решил использовать свойство типа, так как вы не указали свой JSON или ваш метод определения, какой классдесериализовать в.При необходимости замените его собственной логикой.

Попробуйте онлайн

0 голосов
/ 10 июня 2018

Вы можете использовать JObject из библиотеки Newtonsoft.Json.Это сайт https://www.newtonsoft.com/json, чтобы узнать, как его использовать.И здесь также можно найти множество примеров кода https://www.newtonsoft.com/json/help/html/Samples.htm.

Например:

using Newtonsoft.Json.Serialization;

    public void Foo(string jsonData){
    var objData = (JObject)JsonConvert.DeserializeObject(jsonData); // Deserialize json data

    dynamic jObject = new JObject();
jObject.ID = objData.Value<string>("ID");
jObject.Address = objData.Value<string>("Address");
jObject.TABLE2 = objData.Value<JArray>("TABLE2");
    }

В приведенном выше примере кода jObject имеет динамический тип, который можетбыть преобразован в какой тип вы хотите.

Надеюсь, это поможет.

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