System.Text.Json API 有没有像 IContractResolver 这样的东西
System.Text.Json API is there something like IContractResolver
在新的System.Text.Json;命名空间是否有类似 IContractResolver 的东西我正在尝试将我的项目从 Newtonsoft 迁移出去。
这是我要移动的 类 之一:
public class SelectiveSerializer : DefaultContractResolver
{
private readonly string[] fields;
public SelectiveSerializer(string fields)
{
var fieldColl = fields.Split(',');
this.fields = fieldColl
.Select(f => f.ToLower().Trim())
.ToArray();
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = o => fields.Contains(member.Name.ToLower());
return property;
}
}
The equivalent types in System.Text.Json -- JsonClassInfo
and JsonPropertyInfo
-- are internal. There is an open enhancement
Equivalent of DefaultContractResolver in System.Text.Json #31257
asking for a public equivalent. – dbc Nov 25 at 19:11
Github 个问题:
- Open up metadata infrastructure of System.Text.Json #34456
- Equivalent of DefaultContractResolver.CreateProperties override in System.Text.Json #60518
- Equivalent of DefaultContractResolver in System.Text.Json #31257
请试试这个:
我将其写为 System.Text.Json 的扩展以提供缺少的功能:https://github.com/dahomey-technologies/Dahomey.Json.
您会发现对编程对象映射的支持。
定义您自己的 IObjectMappingConvention 实现:
public class SelectiveSerializer : IObjectMappingConvention
{
private readonly IObjectMappingConvention defaultObjectMappingConvention = new DefaultObjectMappingConvention();
private readonly string[] fields;
public SelectiveSerializer(string fields)
{
var fieldColl = fields.Split(',');
this.fields = fieldColl
.Select(f => f.ToLower().Trim())
.ToArray();
}
public void Apply<T>(JsonSerializerOptions options, ObjectMapping<T> objectMapping) where T : class
{
defaultObjectMappingConvention.Apply<T>(options, objectMapping);
foreach (IMemberMapping memberMapping in objectMapping.MemberMappings)
{
if (memberMapping is MemberMapping<T> member)
{
member.SetShouldSerializeMethod(o => fields.Contains(member.MemberName.ToLower()));
}
}
}
}
定义你的 class:
public class Employee
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
通过在 JsonSerializerOptions 上调用命名空间 Dahomey.Json:
中定义的扩展方法 SetupExtensions 来设置 json 扩展
JsonSerializerOptions options = new JsonSerializerOptions();
options.SetupExtensions();
为class注册新的对象映射约定:
options.GetObjectMappingConventionRegistry().RegisterConvention(
typeof(Employee), new SelectiveSerializer("FirstName,Email,Id"));
然后用常规 Sytem.Text.Json API:
序列化你的 class
Employee employee = new Employee
{
Id = 12,
FirstName = "John",
LastName = "Doe",
Email = "john.doe@acme.com"
};
string json = JsonSerializer.Serialize(employee, options);
// {"Id":12,"FirstName":"John","Email":"john.doe@acme.com"};
在新的System.Text.Json;命名空间是否有类似 IContractResolver 的东西我正在尝试将我的项目从 Newtonsoft 迁移出去。
这是我要移动的 类 之一:
public class SelectiveSerializer : DefaultContractResolver
{
private readonly string[] fields;
public SelectiveSerializer(string fields)
{
var fieldColl = fields.Split(',');
this.fields = fieldColl
.Select(f => f.ToLower().Trim())
.ToArray();
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = o => fields.Contains(member.Name.ToLower());
return property;
}
}
The equivalent types in System.Text.Json --
JsonClassInfo
andJsonPropertyInfo
-- are internal. There is an open enhancement Equivalent of DefaultContractResolver in System.Text.Json #31257 asking for a public equivalent. – dbc Nov 25 at 19:11
Github 个问题:
- Open up metadata infrastructure of System.Text.Json #34456
- Equivalent of DefaultContractResolver.CreateProperties override in System.Text.Json #60518
- Equivalent of DefaultContractResolver in System.Text.Json #31257
请试试这个:
我将其写为 System.Text.Json 的扩展以提供缺少的功能:https://github.com/dahomey-technologies/Dahomey.Json.
您会发现对编程对象映射的支持。
定义您自己的 IObjectMappingConvention 实现:
public class SelectiveSerializer : IObjectMappingConvention
{
private readonly IObjectMappingConvention defaultObjectMappingConvention = new DefaultObjectMappingConvention();
private readonly string[] fields;
public SelectiveSerializer(string fields)
{
var fieldColl = fields.Split(',');
this.fields = fieldColl
.Select(f => f.ToLower().Trim())
.ToArray();
}
public void Apply<T>(JsonSerializerOptions options, ObjectMapping<T> objectMapping) where T : class
{
defaultObjectMappingConvention.Apply<T>(options, objectMapping);
foreach (IMemberMapping memberMapping in objectMapping.MemberMappings)
{
if (memberMapping is MemberMapping<T> member)
{
member.SetShouldSerializeMethod(o => fields.Contains(member.MemberName.ToLower()));
}
}
}
}
定义你的 class:
public class Employee
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
通过在 JsonSerializerOptions 上调用命名空间 Dahomey.Json:
中定义的扩展方法 SetupExtensions 来设置 json 扩展JsonSerializerOptions options = new JsonSerializerOptions();
options.SetupExtensions();
为class注册新的对象映射约定:
options.GetObjectMappingConventionRegistry().RegisterConvention(
typeof(Employee), new SelectiveSerializer("FirstName,Email,Id"));
然后用常规 Sytem.Text.Json API:
序列化你的 classEmployee employee = new Employee
{
Id = 12,
FirstName = "John",
LastName = "Doe",
Email = "john.doe@acme.com"
};
string json = JsonSerializer.Serialize(employee, options);
// {"Id":12,"FirstName":"John","Email":"john.doe@acme.com"};