Как DeserializeObject из json, где модель данных существует в Entity Framework? - PullRequest
0 голосов
/ 21 марта 2019

У меня есть входящий объект json, который представляет данные, извлеченные из структуры базы данных.

Я хотел бы сопоставить его с моделью Entity Framework, которая имеет определения либо из атрибутов, либо из построителя модели в контексте БД.

При запуске Entity Framework эти данные отображаются правильно, поэтому я знаю, что модели верны.

Таким образом, используя ту же структуру, вместо вызова базы данных через EF, я извлекаю из API, который имеет ту же структуру входящих данных, что и имена столбцов entity.Property.

Как мне сопоставить входящую структуру 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?

Обновление

Я знаю, как отобразить json на объект, используя Newtonsoft. Я пытаюсь сопоставить с сущностью без использования картографа. Entity Framework уже имеет эти значения, я надеялся просто использовать связывание Entity Framework.

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Хорошо, вместо того, чтобы принудить 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>());
    
0 голосов
/ 21 марта 2019

Я использовал JsonConvert.DeserializeObject из Newtonsoft , чтобы сделать это в прошлом. Надеюсь, это поможет.

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.
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...