为啥 .NET 自带的 JsonSerializer 无法序列化 Field ?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥 .NET 自带的 JsonSerializer 无法序列化 Field ?相关的知识,希望对你有一定的参考价值。

咨询区

  • Theyouthis

最近我将项目升级到 .NET Core 3 之后,我发现自带的 System.Text.Json.JsonSerializer 序列化器有一个奇葩的问题,它不支持对 类字段 的序列化。。。

参考如下代码:


namespace ConsoleApp6
{
    class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car()
            {
                Model = "Fit",
                Year = 2008,
            };

            string json = JsonSerializer.Serialize(car); // {"Year":2008}
            Car carDeserialized = JsonSerializer.Deserialize<Car>(json);

            Console.WriteLine(carDeserialized.Model); // null!
        }
    }

    public class Car
    {
        public int Year { get; set; } // does serialize correctly
        public string Model; // doesn't serialize correctly
    }
}

只有将字段改成属性才可以,要多坑有多坑,现在全量修改代码那是不可能的了,请问是否有变通的方法实现呢?

回答区

  • pavinan

字段被序列化的问题,在 .NET5 中已经加入了,但还是需要你在 JsonSerializerOptions 中显示开启,如下代码所示:


static void Main()
{
    var car = new Car { Model = "Fit", Year = 2008 };

    // Enable support
    var options = new JsonSerializerOptions { IncludeFields = true };

    // Pass "options"
    var json = JsonSerializer.Serialize(car, options);

    // Pass "options"
    var carDeserialized = JsonSerializer.Deserialize<Car>(json, options);

    Console.WriteLine(carDeserialized.Model); // Writes "Fit"
}

public class Car
{
    public int Year { get; set; }
    public string Model;
}

  • Michaël Catanzariti

我写了一个库对 System.Text.Json 做了一些扩展,你可以试试看,github:https://github.com/dahomey-technologies/Dahomey.Json ,这个库中我已经加入了对 field 的支持,参考代码:


using System.Text.Json;
using Dahomey.Json

public class Car
{
    public int Year { get; set; } // does serialize correctly
    public string Model; // will serialize correctly
}

static void Problem() {
    JsonSerializerOptions options = new JsonSerializerOptions();
    options.SetupExtensions(); // extension method to setup Dahomey.Json extensions

    Car car = new Car()
    {
        Model = "Fit",
        Year = 2008,
    };
    string json = JsonSerializer.Serialize(car, options); // {"Year":2008,"Model":"Fit"}
    Car carDeserialized = JsonSerializer.Deserialize<Car>(json);

    Console.WriteLine(carDeserialized.Model); // Fit
}

点评区

我去,这确实是一个蛮大的坑,幸亏我一直在用 JSON.NET,这也说明 System.Text.Json 目前还不是特别完善,没有达到替代 JSON.NET 的程度,大家用的时候注意避坑。

以上是关于为啥 .NET 自带的 JsonSerializer 无法序列化 Field ?的主要内容,如果未能解决你的问题,请参考以下文章

JsonSerialize的字段[include]已经过时,已被JsonInclude代替

JsonSerialize的字段[include]已经过时,已被JsonInclude代替

@jsonserialize在啥时候生效

@JsonSerialize

@JsonSerialize的使用

@JsonSerialize 和 @JsonDeserialize 在包含在注释中时不起作用