如何将 class 字段与 System.Text.Json.JsonSerializer 一起使用?
How to use class fields with System.Text.Json.JsonSerializer?
我最近将一个解决方案升级为所有 .NET Core 3,并且我有一个 class 需要 class 变量作为字段。这是一个问题,因为新的 System.Text.Json.JsonSerializer
不支持序列化或反序列化字段,而是只处理属性。
有什么方法可以确保下面示例中的两个最终 class 具有完全相同的值吗?
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!
}
在.NET Core 3.x中,System.Text.Json不序列化字段。来自 docs:
Fields are not supported in System.Text.Json in .NET Core 3.1. Custom converters can provide this functionality.
在 .NET 5 及更高版本中,可以通过设置 JsonSerializerOptions.IncludeFields
to true
or by marking the field to serialize with [JsonInclude]
:
来序列化 public 字段
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;
}
详情见:
请试试我写的这个库作为 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
}
我最近将一个解决方案升级为所有 .NET Core 3,并且我有一个 class 需要 class 变量作为字段。这是一个问题,因为新的 System.Text.Json.JsonSerializer
不支持序列化或反序列化字段,而是只处理属性。
有什么方法可以确保下面示例中的两个最终 class 具有完全相同的值吗?
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!
}
在.NET Core 3.x中,System.Text.Json不序列化字段。来自 docs:
Fields are not supported in System.Text.Json in .NET Core 3.1. Custom converters can provide this functionality.
在 .NET 5 及更高版本中,可以通过设置 JsonSerializerOptions.IncludeFields
to true
or by marking the field to serialize with [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;
}
详情见:
请试试我写的这个库作为 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
}