C# JsonConverter不作为属性使用

C# JsonConverter不作为属性使用,c#,json.net,.net-core,C#,Json.net,.net Core,我有一个对象,它包含一个具有JsonConverter属性的属性。对于数据读取和写入,转换器不工作。声明的属性为 [JsonConverter(typeof(EpochDateTimeConverter))] public DateTime CreatedOn { get; set; } EpochDateTimeConverter是 public class EpochDateTimeConverter : DateTimeConverterBase { priva

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

[JsonConverter(typeof(EpochDateTimeConverter))]
public DateTime CreatedOn { get; set; } 
EpochDateTimeConverter是

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不会自动调用。我不明白怎么了。有人能帮我吗?

当您的JsonConverter正在进行时,这会自动调用。默认情况下,.NET核心API使用Newtonsoft.json对json对象进行序列化和反序列化。这里的JsonConverter也存在于Newtonsoft.Json命名空间中,因此在使用这个JsonConverter静态类时,它将通过适当的过程自动调用

JsonConvert.SerializeObject(YourClassWhichContainThePropertyWithYourAttribute);

您也可以通过调用此函数来检查这一点。

经过一些研究,我发现Enitity和Converter之间不匹配。两个类的JsonConverter不相同。这就是为什么它没有被命名。更新JsonConverter后,请确保使用
System.Text.Json.Serialization
而不是
Newtonsoft.Json

是否有
DateTimeConverterBase
的代码?从DateTimeConverterBase继承的EpochDateTimeConverter哦,它是Json.NET的一部分。我懂了。可能有答案。当JsonConverter使用as属性自动调用时,仍然不工作。JsonConvert.SerializeObject此时无需使用。当此对象被序列化或反序列化时,将调用此属性,因此在不调用任何类型的方法的情况下,此属性都不起作用。不,不。您没有理解我的意思。用于日期时间转换的EpochDateTimeConverter。这不是数据序列化问题。谢谢。这个答案并没有太大帮助——你说的“不属于同一类”是什么意思?请试着让你的答案对那些后来遇到同样问题的人有所帮助,这表明你必须改变什么。好的,我会解释一下,你能解释一下吗?“快乐转储有什么问题吗?”这里是对象注释不匹配问题不确定这是否是他的意思,但我也有同样的问题,发现我的[JsonProperty(“propname”)]属性不正确。即它没有;与我试图解析的json不匹配。例如,它应该是[JsonProperty(“prop_name”)]。希望这个评论能节省一些时间。在我的情况下,正好相反。当我必须使用Newtonsoft.Json时,我使用的是System.Text.Json.Serialization