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

How to serialize non-property members in .net core 3.1?

我们刚刚将 Web api 项目从 .net core 2.2 迁移到 3.1。 今天我们 运行 遇到了一个意想不到的问题,其中 public class 成员没有被序列化为 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 核心 3 中支持什么。1.The 下面的文档清楚地指出了您可以使用JsonSerializerOptions.IncludeFields 全局设置[JsonInclude]属性在序列化或反序列化时包含字段。

参考:

https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to?pivots=dotnet-5-0#include-fields

我认为一个简单的方法是迁移到asp.net5,然后选择上面两种方法中的一种。

对于asp.net core 3.1,不支持Fields,可以查看the docs,

Fields are not supported in System.Text.Json in .NET Core 3.1.Custom converters can provide this functionality.

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

}

参考:

https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-converters-how-to?pivots=dotnet-core-3-1