选择 class 属性到 include/exclude 进行 JSON 序列化
Choose class properties to include/exclude for JSON serialization
在使用 System.Text.Json.Serialization 序列化 class 时,是否可以指定包含或排除哪些属性?
我知道有我可以使用的成员属性 (JsonIgnoreAttribute, JsonIgnoreCondition
)。但是我需要一种方法在某些情况下包含一些属性并在另一种情况下排除其他属性。
例如:
- 在场景 'A' 中我需要 include 属性
foo.name
- 在场景'B'中我需要排除属性
foo.name
JsonIgnoreAttribute 将始终排除 属性。
JsonIgnoreCondition 基于 属性 值。
在 Newtonsoft JSON 库中有 ContractResolver
可以完成这项工作。但我真的不希望在我的项目中使用 2 JSon 序列化引擎。
备案
正如 Peter Csala 所建议的,我最终使用了 JsonConverter
它完全符合我的需要。
概念是:
public class BaseTypeOnlyConverter<T> : JsonConverter<T>
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
writer.WriteStartObject();
var t = value.GetType();
var propertiesName = t.GetProperties()
.Where(o => ShouldInclude(o))
.Select(o => o.Name.ToLower())
.ToList();
using (var document = JsonDocument.Parse(JsonSerializer.Serialize(value)))
{
foreach (var property in document.RootElement.EnumerateObject())
{
if (propertiesName.Contains(property.Name.ToLower()))
property.WriteTo(writer);
}
}
writer.WriteEndObject();
}
private bool ShouldInclude(PropertyInfo propertyInfo)
{
//Do checkup ...
}
}
在使用 System.Text.Json.Serialization 序列化 class 时,是否可以指定包含或排除哪些属性?
我知道有我可以使用的成员属性 (JsonIgnoreAttribute, JsonIgnoreCondition
)。但是我需要一种方法在某些情况下包含一些属性并在另一种情况下排除其他属性。
例如:
- 在场景 'A' 中我需要 include 属性
foo.name
- 在场景'B'中我需要排除属性
foo.name
JsonIgnoreAttribute 将始终排除 属性。 JsonIgnoreCondition 基于 属性 值。
在 Newtonsoft JSON 库中有 ContractResolver
可以完成这项工作。但我真的不希望在我的项目中使用 2 JSon 序列化引擎。
备案
正如 Peter Csala 所建议的,我最终使用了 JsonConverter
它完全符合我的需要。
概念是:
public class BaseTypeOnlyConverter<T> : JsonConverter<T>
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
writer.WriteStartObject();
var t = value.GetType();
var propertiesName = t.GetProperties()
.Where(o => ShouldInclude(o))
.Select(o => o.Name.ToLower())
.ToList();
using (var document = JsonDocument.Parse(JsonSerializer.Serialize(value)))
{
foreach (var property in document.RootElement.EnumerateObject())
{
if (propertiesName.Contains(property.Name.ToLower()))
property.WriteTo(writer);
}
}
writer.WriteEndObject();
}
private bool ShouldInclude(PropertyInfo propertyInfo)
{
//Do checkup ...
}
}