如何从 json 中存在数据模型的 Entity Framework 反序列化对象?

How to DeserializeObject from json where data model exist in Entity Framework?

我有一个传入的 json 对象,它表示从数据库结构中提取的数据。

我想将它映射到 Entity Framework 模型,该模型具有来自数据库上下文中的属性或模型构建器的定义。

当 运行 Entity Framework 时,此数据映射正确,因此我知道模型是正确的。

因此,我使用相同的结构,而不是通过 EF 调用数据库,而是从具有与 entity.Property 列名称相同的传入数据结构的 API 中提取数据。

如何将传入的 json 结构映射到模型对象?

属性

[Table("model_example")]
public class ModelExample
{
   [Column("property_to_map")] // <-- db column name
   public int PropertyToMap { get; set; }
}

ModelBuilder:

modelBuilder.Entity<ModelExample>(entity =>
{
    entity.ToTable("model_example");
    entity.Property(e => e.PropertyToMap).HasColumnName("property_to_map");
}

传入 JSON 示例:

 { "property_to_map":1 }   

因此,如果此数据是从数据库中提取的,它将自动映射到“ModelExample.PropertyToMap”和 ModelExample 代码模型。

如何映射它?有没有办法使用 Entity Framework 进程?

更新

我知道如何使用 Newtonsoft 从 json 映射到对象。我试图在不使用映射器的情况下映射到实体。 Entity Framework 已经有了这些值,我希望只使用 entity framework 配合。

我过去曾使用 Newtonsoft 中的 JsonConvert.DeserializeObject 来执行此操作。希望这对您有所帮助。

class Example {
  public int property_to_map {get; set;}
}

class ApiCalls{

  public void MakeApiCall() {
     var response = ApiCall();
     var MappedObject = JsonConvert.Deserialize<Example>(response);
     //Do whatever you need now with the mapped object.
  }
}

好的,我没有将 json 强加给模型,而是决定改为更改 Json 字符串。

我通过创建一个自定义的 JsonConverter 并在里面重命名 J属性.

来做到这一点
  1. 构建通用 Json转换器基础 Class

    public abstract class JsonCreationConverter<T> : JsonConverter
    {            
        protected abstract T CreateArray<TJsonType>(Type objectType, TJsonType jObject);
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException("Unnecessary because CanWrite is " +
                                          "false. The type will skip the converter.");
        }
    
        public override object ReadJson(JsonReader reader, Type objectType,
            object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
                return null;
    
            JArray jArray;
            var target = default(T);
            try
            {
                jArray = JArray.Load(reader);
                target = CreateArray<JArray>(objectType, jArray);
            }
            catch (Exception ex)
            {                    
                return null;
            }
            return target;
        }
    
        public override bool CanConvert(Type objectType)
        {
            return typeof(T).IsAssignableFrom(objectType);
        }
    
        public override bool CanWrite
        {
            get { return false; }
        }
    
    }
    
  2. 构建自定义 JSON 转换器。

    public class JsonEntityConverter<TObject> : JsonCreationConverter<TObject>       
    {
        protected override TObject CreateArray<TJsonType>(Type objectType, TJsonType tArray)
        {
            var deserializedObj = default(TObject);
    
            var jArray = (JArray)Convert.ChangeType(tArray, typeof(JArray));
    
            var newjArray = new JArray();
    
            foreach (var item in jArray.Children())
            {
                var itemProperties = item.Children<JProperty>();
    
                var jObj = new JObject();
                foreach (var itemProperty in itemProperties)
                {                    
                    var name = itemProperty.Name.ToModelName();  // <-- Code Below #3                                     
    
                    var newJproperty = new JProperty(name, itemProperty.Value);
                jObj.Add(newJproperty);
                }
    
                 newjArray.Add(jObj);
    
            }
    
            var sObject = Newtonsoft.Json.JsonConvert.SerializeObject(newjArray);
    
            deserializedObj = Newtonsoft.Json.JsonConvert.DeserializeObject<TObject>(sObject);
    
            return deserializedObj;
        }
    }
    
  3. 将 JSON 属性 名称 property_to_map 转换为实体 属性 名称 PropertyToEmpty

    public static partial class StringsExtensions
    {        
        // Changes example_id to exampleId for mapping
        public static string ToModelName(this string text)
        {
            // First we make a space
            text = text.Replace("_", " ");
    
            // Capitalize every word
            text = text.ToUpperEveryWord(); // <-- Code Below #4                    
    
            // remove the extra space
            text = text.Replace(" ", "");
    
            return text;
        }
    }
    
  4. 将每个单词大写

    public static string ToUpperEveryWord(this string s)
    {
        // Check for empty string.  
        if (string.IsNullOrEmpty(s))
        {
            return string.Empty;
        }
    
        var words = s.Split(' ');
    
        var t = "";
        foreach (var word in words)
        {
            t += char.ToUpper(word[0]) + word.Substring(1) + ' ';
        }
    
        return t.Trim();
    }
    
  5. 我怎么称呼它

    var data = Newtonsoft.Json.JsonConvert.DeserializeObject<TType>(item.ToString(), new JsonEntityConverter<TType>());