26

我最近将一个解决方案升级为全部 .NET Core 3,并且我有一个类要求类变量是字段。这是一个问题,因为 newSystem.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!
}
4

2 回答 2

28

.NET Core 3.x中,System.Text.Json 不序列化字段。从文档

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

.NET 5及更高版本中,公共字段可以通过设置JsonSerializerOptions.IncludeFieldstrue或通过标记要序列化的字段来序列化[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;
}

详情见:

于 2019-09-27T18:41:00.600 回答
0

请尝试我作为 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-12-11T21:57:11.597 回答