.Net JsonSerializer 不序列化元组的值
.Net JsonSerializer does not serialize tuple's values
JSON 序列化程序 returns 空 JSON 对象。
using System.Text.Json;
(int, int) tuple1 = (1, 2);
var token = JsonSerializer.Serialize(tuple1); // return empty object {}
(int item1, int item2) tuple2 = (1, 2);
token = JsonSerializer.Serialize(tuple2); // return empty object {}
(int item1, int item2) tuple3 = (item1:1, item2:2);
token = JsonSerializer.Serialize(tuple3); // return empty object {}
它可以通过许多解决方法
我正在尝试了解为什么或是什么阻止了序列化程序理解元组
是否与元组结构有关
ValueTuple 没有属性,只有 public 个字段。在 .NET 6 之前,System.Text.Json 仅序列化 public 属性。这是最常见的情况,因为字段被认为是实现,而不是对象 API 的一部分。所有序列化程序都将属性优先于字段,除非指示也序列化字段。
.NET 6 added the ability to serialize fields 以类似于其他序列化程序的方式,在字段上使用属性或序列化程序设置。
由于我们无法将属性添加到元组字段,我们可以使用设置:
var options = new JsonSerializerOptions
{
IncludeFields = true,
};
var json = JsonSerializer.Serialize(tuple1, options);
这会产生:
{"Item1":1,"Item2":2}
以防万一有人关心反序列化,而你有一个更复杂的 class 元组。
public class Foo
{
public (string key, string value) Tuple1{ get; set; }
}
var options = new JsonSerializerOptions
{
IncludeFields = true,
};
string jsonString = File.ReadAllText("myconfig.json");
Foo obj1 = JsonSerializer.Deserialize<Foo>(jsonString, options);
JSON 序列化程序 returns 空 JSON 对象。
using System.Text.Json;
(int, int) tuple1 = (1, 2);
var token = JsonSerializer.Serialize(tuple1); // return empty object {}
(int item1, int item2) tuple2 = (1, 2);
token = JsonSerializer.Serialize(tuple2); // return empty object {}
(int item1, int item2) tuple3 = (item1:1, item2:2);
token = JsonSerializer.Serialize(tuple3); // return empty object {}
它可以通过许多解决方法
我正在尝试了解为什么或是什么阻止了序列化程序理解元组
是否与元组结构有关
ValueTuple 没有属性,只有 public 个字段。在 .NET 6 之前,System.Text.Json 仅序列化 public 属性。这是最常见的情况,因为字段被认为是实现,而不是对象 API 的一部分。所有序列化程序都将属性优先于字段,除非指示也序列化字段。
.NET 6 added the ability to serialize fields 以类似于其他序列化程序的方式,在字段上使用属性或序列化程序设置。
由于我们无法将属性添加到元组字段,我们可以使用设置:
var options = new JsonSerializerOptions
{
IncludeFields = true,
};
var json = JsonSerializer.Serialize(tuple1, options);
这会产生:
{"Item1":1,"Item2":2}
以防万一有人关心反序列化,而你有一个更复杂的 class 元组。
public class Foo
{
public (string key, string value) Tuple1{ get; set; }
}
var options = new JsonSerializerOptions
{
IncludeFields = true,
};
string jsonString = File.ReadAllText("myconfig.json");
Foo obj1 = JsonSerializer.Deserialize<Foo>(jsonString, options);