C# 从Json反序列化到实体框架6

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

这是我的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: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
的原型实现?