无法使用私有访问器反序列化复杂对象,属性转换遇阻求解
解决方案
要实现你需要的JSON属性转换(反序列化时映射incomingPropName到Prop1,序列化时输出transformedPropName并忽略Prop1),针对自定义对象数组的问题,可以通过调整属性的Json特性来解决:
using System.Text.Json; using System.Text.Json.Serialization; public class YourModel { [JsonPropertyName("incomingPropName")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWriting)] // 序列化时忽略该属性 [JsonInclude] // 允许Json序列化器访问私有getter public MyComplexObject[] Prop1 { private get; set; } [JsonPropertyName("transformedPropName")] public MyComplexObject[] Prop2 { get => Prop1; } }
关键调整说明:
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWriting)]:明确指定序列化时忽略Prop1,仅在反序列化阶段处理incomingPropName的映射,避免序列化时输出原属性名。[JsonInclude]:如果要保留Prop1的private get访问器,这个特性允许System.Text.Json序列化器访问私有访问器——这是你之前string类型有效但自定义对象数组无效的核心原因:复杂类型的反序列化需要序列化器能正确访问属性的访问器,确保数组被正确赋值和引用。
如果不需要Prop1的get是私有,也可以简化为:
[JsonPropertyName("incomingPropName")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWriting)] public MyComplexObject[] Prop1 { get; set; } [JsonPropertyName("transformedPropName")] public MyComplexObject[] Prop2 { get => Prop1; }
调整后,反序列化时incomingPropName的值会正确赋值给Prop1,Prop2通过getter引用Prop1的数组;序列化时只会输出transformedPropName和对应的自定义对象数组,完全符合你的需求,且无需实现IJsonOnDeserialized接口。
内容的提问来源于stack exchange,提问作者AKozak
相关产品推荐
相关产品推荐

