0

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

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

运行实体框架时,此数据映射正确,因此我知道模型是正确的。

因此,使用相同的结构,而不是通过 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 代码模型。

我如何映射它?有没有办法使用实体框架流程?

更新

我知道如何使用 Newtonsoft 从 json 映射到对象。我正在尝试映射到实体而不必使用映射器。实体框架已经有了这些值,我希望只使用实体框架配合。

4

2 回答 2

0

我过去曾使用过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.
  }
}
于 2019-03-21T18:35:45.500 回答
0

好的,我决定改为更改 Json 字符串,而不是强制将 json 转换为模型。

我通过创建自定义 JsonConverter 并在其中重命名 JProperty 来做到这一点。

  1. 构建一个通用的 JsonConverter 基类

    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>());
    
于 2019-03-22T13:31:37.550 回答