当前位置: 首页 > 面试题库 >

使用System.Text.Json的JsonConverter等效项

常坚
2023-03-14
问题内容

我开始将.net Core 3.0应用程序中的一些代码从迁移Newtonsoft.JsonSystem.Text.Json

我从迁移了属性

[JsonProperty("id")][JsonPropertyName("id")]

但我有一些属性装饰着如下JsonConverter属性:

[JsonConverter(typeof(DateTimeConverter))] [JsonPropertyName("birth_date")] DateTime BirthDate{ get; set; }

但是我在System.Text.Json“ 牛顿软件”转换器中找不到等效的东西。有人知道如何在.net Core 3.0中实现吗?

谢谢!


问题答案:

System.Text.Json 现在在.NET 3.0 Preview-7及更高版本中支持自定义类型转换器。

您可以添加类型匹配的转换器,并使用JsonConverter属性将特定转换器用于属性。

这是在long和之间进行转换的示例string(因为javascript不支持64位整数)。

public class LongToStringConverter : JsonConverter<long>
{
    public override long Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.String)
        {
            // try to parse number directly from bytes
            ReadOnlySpan<byte> span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
            if (Utf8Parser.TryParse(span, out long number, out int bytesConsumed) && span.Length == bytesConsumed)
                return number;

            // try to parse from a string if the above failed, this covers cases with other escaped/UTF characters
            if (Int64.TryParse(reader.GetString(), out number))
                return number;
        }

        // fallback to default handling
        return reader.GetInt64();
    }

    public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString());
    }
}

通过将转换器添加到Converters列表中来注册该转换器JsonSerializerOptions

services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.Converters.Add(new LongToStringConverter());
});

注意:当前版本尚不支持可为null的类型。



 类似资料:
  • 我使用一个自定义JsonConverter与System.Text.Json为了有DateTime与所需的时区 我在中这样注册它 就像您在代码中看到的那样,当收到没有时区的日期时,它将崩溃并出现异常,这将导致错误500 InternalServerError 我如何抛出异常以返回400而不触碰使用应用程序。UseExceptionHandler(因为代码在我的库中)? 请注意,引发的异常是Form

  • 问题内容: 我知道您可以使用Newtonsoft轻松地做到这一点。但是,当我使用.NET Core 3.0时,我正在尝试使用新方法与JSON文件进行交互,即,并且我拒绝相信我要做的一切都那么困难! 我的应用程序需要列出尚未添加到我的数据库中的用户。为了获取所有用户的完整列表,该应用程序从Web API检索JSON字符串。现在,我需要循环浏览这些用户中的每一个,并检查是否已将它们添加到我的应用程序中

  • 问题内容: 我有一个来自客户端的对象,并自动从Web Api 2反序列化。 现在,我对模型的一个属性有疑问。此属性“ CurrentField”的类型为IField,此接口有2种不同的实现。 这是我的模型(只是一个假人) 我试图创建一个自定义的JsonConverter来查找来自客户端的对象是什么类型(Field1或Field2),但是我只是不知道如何。 我的Converter被调用,当我调用va

  • 太长,读不下去了如何模拟或使用带有数组的道具强制重置我的组件? 我正在实现一个组件,它显示一个计时器,并在达到零时执行回调。目的是让回调更新对象列表。后一个组件由新的React钩子和组成。 包含对计时器启动时间和剩余时间的引用。设置每秒钟调用一次的间隔,以更新剩余的时间,并检查是否应该调用回调。 该组件并不意味着重新安排计时器,或者在间隔达到零时保持间隔,它应该执行回调并空闲。为了让计时器刷新,我

  • 问题内容: 编辑:澄清问题: 我已经为基本类型重写了JsonConverter(通过应用到超类),但是当直接反序列化子类型时,我想使用STANDARD序列化(即没有自定义转换器)来反序列化我的派生对象。如何指定反序列化方法中使用的STANDARD序列化,就好像我没有重写JsonConverter一样? 我正在使用弹性搜索,并且无法使用我的JsonConverter的自定义实现调用JsonConve

  • 问题内容: 我正在尝试使用.NET Core 3.0中的新JSON阅读器读取和解析无法容纳在内存中的大JSON文件。 Microsoft的示例代码将a 作为输入 我正在努力寻找的是如何在a中实际使用此代码,并将a 插入a 。 我尝试使用以下代码读取文件,然后 它因错误信息而崩溃 作为参考,这是我使用Newtonsoft.Json的工作代码。 问题答案: 更新2019-10-13: 重写Utf8Js