JsonConverter不作为属性属性工作

时间:2018-03-13 04:38:36

标签: c# json.net .net-core

我有一个包含具有JsonConverter属性的属性的对象。对于数据读写,转换器不工作。声明的属性是

public class EpochDateTimeConverter : DateTimeConverterBase
    {
        private static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            if (value == null)
            {
                writer.WriteNull();
                return;
            }

            long millisecondsSinceEpoch;
            if (value is DateTime)
            {
                millisecondsSinceEpoch = Convert.ToInt64((((DateTime)value).ToUniversalTime() - epoch).TotalMilliseconds);
            }
            else
            {
                if (!(value is DateTimeOffset))
                    throw new JsonSerializationException("Expected date object value.");
                millisecondsSinceEpoch = Convert.ToInt64((((DateTimeOffset)value).ToUniversalTime().UtcDateTime - epoch).TotalMilliseconds);
            }
            writer.WriteValue(millisecondsSinceEpoch);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
            {
                if (objectType != typeof(DateTime?) && objectType != typeof(DateTimeOffset?))
                    throw new JsonSerializationException($"Cannot convert null value to {objectType}");

                return null;
            }
            if (reader.TokenType == JsonToken.Integer || reader.TokenType == JsonToken.Float)
            {
                var millisecondsSinceEpoch = (long)reader.Value;
                var dateTime = FromUnixTime(millisecondsSinceEpoch);
                if (objectType == typeof(DateTime) || objectType == typeof(DateTime?))
                {
                    return dateTime;
                }
                else
                {
                    return new DateTimeOffset(dateTime);
                }
            }
            if (reader.TokenType == JsonToken.Date || reader.TokenType == JsonToken.Float)
            {
                return ConvertToUnixTimestamp(Convert.ToDateTime(reader.Value));
            }
            throw new JsonSerializationException($"Cannot convert to DateTime or DateTimeOffset from token type {reader.TokenType}");
        }
        private static DateTime FromUnixTime(long unixTime)
        {
            try
            {
                return epoch.AddSeconds(unixTime);
            }
            catch(Exception)
            {
                unixTime = unixTime / 1000;
                return epoch.AddSeconds(unixTime);
            }

        }

        public static double ConvertToUnixTimestamp(DateTime date)
        {
            DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
            TimeSpan diff = date.ToUniversalTime() - origin;
            return Math.Floor(diff.TotalSeconds);
        }

    }

EpochDateTimeConverter是

int NUM_THREADS = 2

我无法得到错误。但是EpochDateTimeConverter没有自动调用。我不明白什么是错的。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:3)

请确保使用System.Text.Json.Serialization而不是Newtonsoft.Json

答案 1 :(得分:0)

经过一些研究,我发现Enitity和Converter之间不匹配。这两个类的JsonConverter不同。这就是为什么它没有被调用的原因。更新JsonConverter后,它的工作。

答案 2 :(得分:-1)

当你的 JsonConverter 正在进行时,这会自动调用。默认情况下,.NET Core API使用 Newtonsoft.Json 来序列化和反序列化json对象。这里 JsonConverter 也存在于 Newtonsoft.Json 命名空间中,所以当你使用这个 JsonConverter 静态类时它会自动调用适当的程序。

JsonConvert.SerializeObject(YourClassWhichContainThePropertyWithYourAttribute);

您也可以通过调用此功能来检查此功能