使用JsonConverter在C#中自定义JSON反序列化

QA_Col

我在.Net Core中有两个类

班级 Ownership

namespace CustomStoreDatabase.Models
{
    public class Ownership
    {
        public string OwnershipId { get; set; }
        public List<string> TextOutput { get; set; }
        public DateTime DateTime { get; set; }
        public TimeSpan MeanInterval { get; set; }// Like long ticks, TimeSpan.FromTicks(Int64), TimeSpan.Ticks
    }
}

我需要表现出MeanInterval像长蜱,使用方法TimeSpan.FromTicks(Int64)TimeSpan.Ticks

我的自定义JsonConverter

using CustomStoreDatabase.Models;
using System;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace CustomStoreDatabase.Util
{
    public class OwnershipJSonConverter : JsonConverter<Ownership>
    {
        public override bool CanConvert(Type typeToConvert)
        {
            return true;
        }

        public override Ownership Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType != JsonTokenType.StartObject)
            {
                throw new JsonException();
            }
            //*******************
            // HOW TO IMPLEMENT?
            //*******************
            //throw new NotImplementedException();
        }

        public override void Write(Utf8JsonWriter writer, Ownership value, JsonSerializerOptions options)
        {
            writer.WriteStartObject();
            if (value != null)
            {
                writer.WriteString("OwnershipId", value.OwnershipId);
                writer.WriteString("TextOutput", JsonSerializer.Serialize(value.TextOutput));
                writer.WriteString("DateTime", JsonSerializer.Serialize(value.DateTime));
                if (value.MeanInterval != null)
                {
                    writer.WriteNumber("MeanInterval", (long)value.MeanInterval.Ticks);
                }
                else
                {
                    writer.WriteNull("MeanInterval");
                }
            }
            writer.WriteEndObject();
        }
    }
}

我不知道如何实现该Read方法。如何实现覆盖Read方法的自定义反序列化?

如果有可能你们向我建议另一个CanConvert方法实现,我非常感谢您。

约翰

好像你只需要执行自定义序列化TimeSpan,因为它属于Ownership,那么为什么不使一个转换器TimeSpan仅保存自己从手动序列化的所有其他类的属性?:

public class TimeSpanConverter : JsonConverter<TimeSpan>
{
    public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return TimeSpan.FromTicks(reader.GetInt64());
    }

    public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options)
    {
        writer.WriteNumberValue(value.Ticks);
    }
}

然后MeanInterval用来装饰您的财产JsonConverterAttribute

public class Ownership
{
    public string OwnershipId { get; set; }
    public List<string> TextOutput { get; set; }
    public DateTime DateTime { get; set; }
    [JsonConverter(typeof(TimeSpanConverter))]
    public TimeSpan MeanInterval { get; set; }// Like long ticks, TimeSpan.FromTicks(Int64), TimeSpan.Ticks
}

在线尝试

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JSON.Net无法在自定义JsonConverter中反序列化JSON数组

如何使用自定义JsonConverter在Json.NET中仅反序列化子对象?

如何在C#中反序列化自定义json

如何在JSON.NET中实现自定义JsonConverter以反序列化基类对象列表?

使用Jackson自定义JSON反序列化

在自定义JsonConverter中反序列化嵌套对象列表

使用自定义JsonConverter反序列化接口列表?

C# Newtonsoft 使用声明反序列化自定义对象?

如何使用XmlSerializer在C#中反序列化期间将xml属性转换为自定义对象

使用YamlDotNEt和C#中的自定义类型类反序列化嵌套的YAML

Go中接口的自定义JSON序列化和反序列化

使用Jackson的自定义JSON序列化/反序列化

使用自定义转换器从流中反序列化Json

使用自定义合同解析器而不是JsonConverter属性时,将忽略自定义JsonConverter进行反序列化

反序列化Web.API参数时未调用自定义Json.NET JsonConverter

使用JsonConverter的Json.NET自定义序列化-如何获得“默认”行为

如何在自定义System.Text.Json JsonConverter中使用默认序列化?

Ktor自定义json对象反序列化

自定义JsonConverter不适用于WebAPI对象反序列化

自定义反序列化

java-在自定义反序列化中调用标准反序列化

使用自定义IXmlSerializer反序列化注释

使用GSON自定义反序列化枚举

使用Jackson自定义反序列化列表

NewtonSoft.Json自定义JsonConverter反序列化为DateTime不起作用

如何使用Json.Net使用自定义键对字典进行序列化/反序列化?

无法使用Scala Circle json库中的LocalDateTime的自定义解码器反序列化对象

在Newtonsoft.Json中反序列化自定义异常

对Java中的自定义枚举值反序列化json响应