如何在 .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]
属性在序列化或反序列化时包含字段。
参考:
我认为一个简单的方法是迁移到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; }
}
参考:
我们刚刚将 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]
属性在序列化或反序列化时包含字段。
参考:
我认为一个简单的方法是迁移到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; }
}
参考: