代码之家  ›  专栏  ›  技术社区  ›  user1012506

如何将json反序列化为使用基类的通用实体?

  •  0
  • user1012506  · 技术社区  · 6 年前

    我需要将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 回复  |  直到 6 年前
        1
  •  2
  •   Llama    6 年前

    复制链接可能是更好的通用解决方案:

    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,这样就不必每次使用它时都继续编写声明。

    另外,我选择了假设一个“type”属性,因为您没有显示json,也没有显示确定要反序列化到哪个类的方法。根据需要替换为您自己的逻辑。

    Try it online

        2
  •  3
  •   Junius Anton    6 年前

    你可以使用 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 它有一个动态类型,可以转换为你想要的类型。

    希望这有帮助。