我有一个类
当解析器的
序列化器以"平面"模式工作,即它通过解析器运行所有道具,并且当成员为
请注意,我无法通过[JsonProperty]、[JsonIgnore]等解决此问题,因为我的属性是复杂的,涉及其自己的逻辑。
PersonDto
,其中包含类型为AddressDto
的属性实例。 我正在构建一个自定义的ContractResolver
,命名为例如ShouldSerializeContractResolver
,使用Newtonsoft.Json
编组.NET库,它将仅包括标记有我的自定义属性[ShouldSerialize]
的序列化特定属性。当解析器的
CreateProperty
方法进入PersonDto
的复杂/自定义类型时,即进入AddressDto
时,问题就出现了,并且它不知道属性实例被标记为[ShouldSerialize]
属性。 然后,生成的序列化看起来像"Address": {}
而不是"Address": { "StreetNumber": 123 }
代码如下:class AddressDto
{
// PROBLEM 1/2: value does not get serialized, but I want it serialized as its property is [ShouldSerialize] attr tagged
public int StreetNumber { get; set; }
}
class PersonDto
{
public string Name { get; set; } // should not serialize as has not attr on it
[ShouldSerialize]
public string Id { get; set; }
[ShouldSerialize]
public AddressDto Address { get; set; }
}
// JSON contract resolver:
public class ShouldSerializeContractResolver: DefaultContractResolver
{
public ShouldSerializeContractResolver() { }
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
var attr = member.GetCustomAttribute<ShouldSerializeContractResolver>(inherit: false);
// PROBLEM 2/2: here I need the code to access the member.DeclaringType instance somehow and then
// find its AddressDto property and its GetCustomAttribute<ShouldSerializeContractResolver>
if (attr is null)
{
property.ShouldSerialize = instance => { return false; };
}
return property;
}
}
// code invoked as:
PersonDto somePerson = IrrelevantSomePersonCreateNewFactoryFn();
var jsonSettings = new JsonSerializerSettings { ContractResolver = new ShouldSerializeContractResolver() };
var strJson = JsonConvert.SerializeObject(somePerson, jsonSettings);
序列化器以"平面"模式工作,即它通过解析器运行所有道具,并且当成员为
StreetNumber
时,我不知道如何访问"父级"MemberInfo,这将非常有用。
我认为这里的核心问题是我没有“父”/DeclaringType对象实例,并需要找到一种获取它的方法。请注意,我无法通过[JsonProperty]、[JsonIgnore]等解决此问题,因为我的属性是复杂的,涉及其自己的逻辑。
[ShouldSerialize]
标记AddressDto
子类型的属性,但这不是我想要的... - Vedran MandićAddressDto
根据是否通过标记为[ShouldSerialize]
的属性遇到而以不同的方式进行序列化,但它并没有被设计成这样。你需要做一些更复杂的事情,比如注入一个转换器,为每个标记为[ShouldSerialize]
的值切换到不同的序列化程序/合同解析器。这额外的努力值得吗? - dbc