【问题标题】:How to use class fields with System.Text.Json.JsonSerializer?如何将类字段与 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!
}

【问题讨论】:

    标签: c# json.net .net-core-3.0 system.text.json


    【解决方案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 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
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-09
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多