System.Text.Json 不序列化 List<T>
Posted
技术标签:
【中文标题】System.Text.Json 不序列化 List<T>【英文标题】:System.Text.Json not serialising List<T> 【发布时间】:2021-03-12 15:21:33 【问题描述】:我只是 .Net 5。
我正在使用 Blazor 创建一个 QC 应用程序,并且我正在使用 System.Text.Json
序列化具有 List<T>
属性的包装对象,这些对象是对发布到服务器并保存在数据库中的 QC 问题的答案。
但是 List 中的每个项目都没有被序列化,因此发布的请求有一个空 List 。
所以在我的代码中,我只是对一个对象进行了非常简单的序列化:
string content = JsonSerializer.Serialize(obj);
如果我调试,我可以看到 Answers
数组的长度正确,但每个项目都是空的:'"Answers":[,,,],...'
但是,C# 对象肯定具有正确输入值的属性。
T
是一个答案对象,它只是一个没有注释的 POCO:
public class ReturnedQCResult
public string Question;
public int QuestionEntryTypeID;
public char QuestionType;
public short QuestionSequence;
public string Text;
public decimal? Number;
public bool? YesNo;
public DateTime? DateEntry;
public TimeSpan? TimeEntry;
public long QuestionID;
有没有人知道为什么会发生这种情况或是否有要打开的设置?
非常感谢。
【问题讨论】:
序列化器序列化属性。However, the C# object most definitely do have properties with the correctly entered values.
,我不同意。该类不包含属性,这些是公共字段。
docs.microsoft.com/en-us/dotnet/standard/serialization/…
谢谢,我应该注意到了!
这不应该被标记为 .NET 5 中的重复项(我正在投票重新提出这个问题)。从 .NET 5 开始,可以标记设置以允许对字段进行序列化。 docs.microsoft.com/en-us/dotnet/standard/serialization/…
【参考方案1】:
虽然以前版本的 System.Text.Json 只能序列化公共属性,但从 .NET 5 开始,您现在可以明确告诉 System.Text.Json 在序列化中包含字段:https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to?pivots=dotnet-5-0#include-fields
var options = new JsonSerializerOptions()
IncludeFields = true,
;
string content = JsonSerializer.Serialize(obj, options);
【讨论】:
.NET 5 终于支持字段了。 @AloisKraus 以及序列化程序的显着性能改进。 是的。我这里有一个基准套件:github.com/Alois-xx/SerializerTests/blob/master/Serializers/… 虽然这可行,但更受欢迎的解决方案是将 get; set;
添加到所有这些字段,使其成为属性。以上是关于System.Text.Json 不序列化 List<T>的主要内容,如果未能解决你的问题,请参考以下文章
Swagger UI 不使用 Newtonsoft.Json 序列化十进制,而是使用 System.Text.json
使用 System.Text.Json 转换不一致的 json 值 [重复]
缺少属性时如何强制 System.Text.Json 序列化程序抛出异常?
将 false 反序列化为 null (System.Text.Json)