You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法使用私有访问器反序列化复杂对象,属性转换遇阻求解

解决方案

要实现你需要的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; }
}

关键调整说明:

  1. [JsonIgnore(Condition = JsonIgnoreCondition.WhenWriting)]:明确指定序列化时忽略Prop1,仅在反序列化阶段处理incomingPropName的映射,避免序列化时输出原属性名。
  2. [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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:27:30