C# 从Json反序列化到实体框架6
这是我的JSON文件,来自SWAGGER:C# 从Json反序列化到实体框架6,c#,json,entity-framework,serialization,C#,Json,Entity Framework,Serialization,这是我的JSON文件,来自SWAGGER: { "TrailerId": "33333", "UpdatedBy": "JWW", "Name": "REEFERERROR", "StatusDate": "2017-03-22T20:26:45.898Z", "Fuel": 23, "Location": { "Latitude": 522, "Longitude": -2350, "LocationDate": "2017-03-22T20:2
{
"TrailerId": "33333",
"UpdatedBy": "JWW",
"Name": "REEFERERROR",
"StatusDate": "2017-03-22T20:26:45.898Z",
"Fuel": 23,
"Location": {
"Latitude": 522,
"Longitude": -2350,
"LocationDate": "2017-03-22T20:26:45.898Z"
},
"AmbientTemperature": 11,
"Mode": {
"Value": 2,
"DisplayName": "Automatic"
},
"Power": {
"Value": 0,
"DisplayName": "Off"
},
"AlarmStatus": {
"Value": 3,
"DisplayName": "All"
},
"HasBatteryAlert": false,
"HasFuelAlert": true,
"HasPreventiveMaintenanceAlert": false,
"SetPointTemperature": 23,
"DischargeTemperature": 33,
"ReturnTemperature": 22,
"ServiceState": {
"Value": 1,
"DisplayName": "Remote"
},
"SwitchedOnHours": 22,
"EngineHours": 345,
"BatteryVoltage": 12,
"Id": 0,
"GuidId": "string"
}
JSON可以毫无问题地反序列化它,直到它达到“Mode”类型。模式类型定义如下:
[DataContract]
[JsonConverter(typeof(TypeSafeEnumerationConverter))]
public sealed class ReeferMode : TypeSafeEnumeration
{
/// <inheritdoc />
private ReeferMode(int value, string displayName) : base(value, displayName) { }
public static readonly ReeferMode Continuous = new ReeferMode(0, "Continuous");
public static readonly ReeferMode StartStop = new ReeferMode(1, "Start/Stop");
public static readonly ReeferMode Automatic = new ReeferMode(2, "Automatic");
public static readonly ReeferMode None = new ReeferMode(-1, "None");
}
[DataContract]
[JsonConverter(typeof(TypeSafeEnumerationConverter))]
公共密封类ReeferMode:TypeSafeEnumeration
{
///
私有ReeferMode(int值,字符串displayName):base(值,displayName){}
public static readonly ReeferMode Continuous=新的ReeferMode(0,“Continuous”);
公共静态只读REFERMODE StartStop=新REFERMODE(1,“启动/停止”);
公共静态只读ReeferMode Automatic=新ReeferMode(2,“自动”);
public static readonly ReeferMode None=新的ReeferMode(-1,“None”);
}
当文件进入一个类以将TypeSafe枚举转换为Json值时,它使用以下代码:
/// <summary>
/// Reads the JSON representation of the object.
/// </summary>
/// <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader" /> to read from.</param>
/// <param name="objectType">Type of the object.</param>
/// <param name="existingValue">The existing value of object being read.</param>
/// <param name="serializer">The calling serializer.</param>
/// <returns>The object value.</returns>
/// <exception cref="JsonSerializationException"></exception>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var stringValue = serializer.Deserialize<string>(reader);
var result = TypeSafeEnumeration.GetAll().FirstOrDefault(e => e.DisplayName.ToLower() == stringValue.ToLower() && IsSameOrSubclass(objectType, e.GetType()));
if (result == null)
throw new JsonSerializationException($"Enumeration Name not found in enumeration. Type:{objectType} Value:{stringValue}");
return result;
}
//
///读取对象的JSON表示形式。
///
///这本书是用来阅读的。
///对象的类型。
///正在读取的对象的现有值。
///调用序列化程序。
///对象值。
///
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
if(reader.TokenType==JsonToken.Null)
返回null;
var stringValue=serializer.Deserialize(读取器);
var result=TypeSafeEnumeration.GetAll().FirstOrDefault(e=>e.DisplayName.ToLower()==stringValue.ToLower()&&IsSameOrSubclass(objectType,e.GetType());
如果(结果==null)
抛出新的JsonSerializationException($”枚举中未找到枚举名称。类型:{objectType}值:{stringValue}”);
返回结果;
}
问题是objectType总是以“模式”的形式出现,但无论我做什么,value对象总是空的。因为它是null,所以我无法在属性映射中设置该值,并且它不会持久化到数据库。枚举是在GetAll()方法中找到的,它只是不能返回到.FirstOrDefault,因为现有值为null
关于如何使用JSON反序列化TypeSafeEnumeration以持久化到实体框架映射中,您有什么想法吗
谢谢
约翰这是我们解决问题的方法
if (reader.TokenType == JsonToken.PropertyName || reader.TokenType == Json.Token.Startobject)
{
var tokenObject = JObject.Load(reader);
stringValue = tokenObject["DisplayName"].Value<string();
}
if(reader.TokenType==JsonToken.PropertyName | | reader.TokenType==Json.Token.Startobject)
{
var tokenObject=JObject.Load(读卡器);
stringValue=tokenObject[“DisplayName”]。Value您能否共享TypeSafeEnumeration
的原型实现?