如何将类字段与 System.Text.Json.JsonSerializer 一起使用?

Posted

技术标签:

【中文标题】如何将类字段与 System.Text.Json.JsonSerializer 一起使用?【英文标题】:How to use class fields with System.Text.Json.JsonSerializer? 【发布时间】:2019-09-27 18:25:58 【问题描述】:

我最近将一个解决方案升级为全部 .NET Core 3,并且我有一个需要类变量为字段的类。这是一个问题,因为新的System.Text.Json.JsonSerializer 不支持序列化或反序列化字段,而是只处理属性。

有什么方法可以保证下例中的两个最终类具有相同的精确值?

using System.Text.Json;

public class Car

    public int Year  get; set;  // does serialize correctly
    public string Model; // doesn't serialize correctly


static void Problem() 
    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!

【问题讨论】:

【参考方案1】:

.NET Core 3.x 中,System.Text.Json 不会序列化字段。来自docs:

.NET Core 3.1 中的 System.Text.Json 不支持字段。自定义转换器可以提供此功能。

.NET 5 及更高版本中,公共字段可以通过将JsonSerializerOptions.IncludeFields 设置为true 或使用[JsonInclude] 标记要序列化的字段来序列化:

using System.Text.Json;

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;

详情见:

How to serialize and deserialize (marshal and unmarshal) JSON in .NET: Include fields.

问题#34558 和#876。

【讨论】:

还记录在How to serialize and deserialize JSON in .NET: Serialization behavior:默认情况下,所有公共属性都是序列化的。您可以指定要排除的属性...目前,已排除字段。 我现在编辑了答案,因为它是可能的(在预发布版本中)。 你可以在.net core 3.1中使用Sytem.Text.Json >=5.0.2包【参考方案2】:

请尝试我作为 System.Text.Json 的扩展编写的这个库,以提供缺少的功能:https://github.com/dahomey-technologies/Dahomey.Json。

您将找到对字段的支持。

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

【讨论】:

以上是关于如何将类字段与 System.Text.Json.JsonSerializer 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 System.Text.Json 忽略错误值

。NET Core 3.1-Ajax OnGet和使用NEW System.Text.Json返回对象

如何在反序列化之前使用 System.Text.Json 验证 JSON

System.Text.Json:当json配置具有通用JsonStringEnumConverter时,如何将单个枚举序列化为数字[重复]

如何在 System.Text.Json 中使用 JsonConstructor 属性

Swagger UI 不使用 Newtonsoft.Json 序列化十进制,而是使用 System.Text.json