【问题标题】:.Net JsonSerializer does not serialize tuple's values.Net JsonSerializer 不序列化元组的值
【发布时间】:2022-01-22 22:45:22
【问题描述】:

JSON 序列化程序返回一个空的 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 没有属性,只有公共字段。这些字段被命名为Item1Item2 等。
  • 我发现有趣的是,序列化程序可以使用更明确的Tuple<int,int> 并具有属性Item1Item2
  • @TJRockefeller 这些是类,它们实际上具有属性。值元组没有。
  • @TJRockefeller 这不是更明确,而是完全不同。 Tuple<int,int> 是具有属性的 referencey 类型。 (int,int) 是一个 ValueTuple,一个带有字段的结构体。序列化程序默认使用属性,因为字段通常是实现细节

标签: c# json tuples .net-6.0 system.text.json


【解决方案1】:

ValueTuple 没有属性,只有公共字段。在 .NET 6 之前,System.Text.Json 仅序列化公共属性。这是最常见的情况,因为字段被视为实现,而不是对象 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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-04
    • 2016-10-21
    • 2013-06-23
    • 1970-01-01
    • 2012-11-03
    • 2021-03-21
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多