Как использовать поля класса с System.Text.Json.JsonSerializer?

Недавно я обновил решение до .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!
}

person Theyouthis    schedule 27.09.2019    source источник


Ответы (2)


Поля теперь работают в предварительной версии (я пробовал 5.0.0-rc.1.20451.14), но вы должны включить эту опцию (подробности см. В # 34558 и # 876):

// System.Text.Json 5.0.0-rc.1.20451.14
// 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;
}
person pavinan    schedule 27.09.2019
comment
Также задокументировано в Как для сериализации и десериализации JSON в .NET: поведение сериализации: По умолчанию все общедоступные свойства сериализуются. Вы можете указать свойства для исключения ... В настоящее время поля исключены. - person dbc; 10.11.2019
comment
Я отредактировал ответ сейчас, что это возможно (в предварительной версии). - person Vimes; 23.09.2020
comment
Вы можете использовать пакет Sytem.Text.Json ›= 5.0.2 в .net core 3.1 - person tymtam; 23.04.2021

Попробуйте эту библиотеку, которую я написал как расширение для 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
}
person Michaël Catanzariti    schedule 11.12.2019