Asp.net core 如何序列化.net core 3.1中的非属性成员?
我们刚刚将WebAPI项目从.NETCore2.2迁移到了3.1。 今天,我们遇到了一个意想不到的问题,公共类成员没有被序列化为JSON 例如:Asp.net core 如何序列化.net core 3.1中的非属性成员?,asp.net-core,asp.net-core-webapi,asp.net-core-3.1,system.text.json,Asp.net Core,Asp.net Core Webapi,Asp.net Core 3.1,System.text.json,我们刚刚将WebAPI项目从.NETCore2.2迁移到了3.1。 今天,我们遇到了一个意想不到的问题,公共类成员没有被序列化为JSON 例如: class MyClass { public int mA; public int pA {get; set;} } [...] // and then in a controller: return Ok(new MyClass { mA = 1, pA = 2 }); 接收到的JSON对象如下所示: {
class MyClass {
public int mA;
public int pA {get; set;}
}
[...]
// and then in a controller:
return Ok(new MyClass {
mA = 1,
pA = 2
});
接收到的JSON对象如下所示:
{
"pA":2
}
用于在使用Newtonsoft的.net core 2.2中工作的序列化
有没有办法将System.Text.Json配置为支持非属性成员的序列化?您可以像这样启用字段支持
var jsonSerializerOptions = new JsonSerializerOptions { IncludeFields = true };
这将在Startup.cs中全局启用
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.IncludeFields = true;
});
@NAS在asp.net 5.0而不是asp.net core 3.1中所支持的内容。下面的文档清楚地指出,您可以使用
JsonSerializerOptions.IncludeFields
全局设置或[JsonInclude]
属性在序列化或反序列化时包含字段
参考:
我认为一个简单的方法是迁移到asp.net 5,并选择上面两种方法中的每一种
对于asp.net core 3.1,它不支持字段
,您可以检查
.NET Core 3.1.Custom中的System.Text.Json不支持字段
转换器可以提供此功能
参考:
public class FieldConverter
: JsonConverter<MyClass>
{
public override void Write(Utf8JsonWriter writer,
MyClass value,
JsonSerializerOptions options)
{
//serialize to json
writer.WriteStartObject();
writer.WriteNumber("mA", value.mA);
writer.WriteNumber("pA", value.pA);
writer.WriteEndObject();
}
public override MyClass Read(ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options)
{
//deserialize to model...
var model = new MyClass();
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.PropertyName)
{
string propertyName = reader.GetString();
reader.Read();
switch (propertyName)
{
case "mA":
int ma = reader.GetInt32();
model.mA = ma;
break;
case "pA":
int pa = reader.GetInt32();
model.pA = pa;
break;
}
}
}
return model;
}
}
[JsonConverter(typeof(FieldConverter))]
public class MyClass
{
public int mA;
public int pA { get; set; }
}