Asp.net core 如何序列化.net core 3.1中的非属性成员?

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对象如下所示: {

我们刚刚将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对象如下所示:

{
    "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; }

}