如何从 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属性.
来做到这一点
构建通用 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; }
}
}
构建自定义 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;
}
}
将 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;
}
}
将每个单词大写
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();
}
我怎么称呼它
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<TType>(item.ToString(), new JsonEntityConverter<TType>());
我有一个传入的 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属性.
来做到这一点构建通用 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; } } }
构建自定义 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; } }
将 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; } }
将每个单词大写
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(); }
我怎么称呼它
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<TType>(item.ToString(), new JsonEntityConverter<TType>());