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

内层属性名动态变化的JSON如何反序列化到固定C#类结构?

解决方案

问题核心是currencies字段对应的JSON对象的键是动态变化的(KGS/SOS等货币代码),无法直接映射到固定命名的Inner属性,以下是两种可行的处理方案:


方案1:自定义JsonConverter(保留原有类结构)

该方案不需要修改你已经定义的三个类的结构,通过Newtonsoft.Json的自定义转换器实现动态键的映射:

  1. 实现OuterClass的自定义转换器:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class OuterClassConverter : JsonConverter<OuterClass>
{
    public override OuterClass ReadJson(JsonReader reader, Type objectType, OuterClass existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 加载currencies对应的JSON对象
        var jObj = JObject.Load(reader);
        // 取第一个属性(就是动态的货币代码对应的属性)
        var currencyProp = jObj.Properties().FirstOrDefault();
        if (currencyProp == null) return null;
        
        return new OuterClass
        {
            // 把属性值反序列化为InnerClass赋值给Inner
            Inner = currencyProp.Value.ToObject<InnerClass>(serializer)
        };
    }

    public override void WriteJson(JsonWriter writer, OuterClass value, JsonSerializer serializer)
    {
        // 如果不需要序列化回JSON,可直接抛出异常
        throw new NotImplementedException();
        // 如果需要序列化,可按需求实现:把Inner序列化为键为对应货币代码的对象即可
    }
}
  1. 启用转换器,二选一即可:
    • 方式一:给OuterClass添加特性
    [JsonConverter(typeof(OuterClassConverter))]
    public class OuterClass
    {
        public InnerClass Inner { get; set; }
    }
    
    • 方式二:反序列化时传入参数
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new OuterClassConverter());
    var result = JsonConvert.DeserializeObject<IList<ParentClass>>(responseBody.Content, settings);
    

方案2:字典中转(代码量更少,易维护)

如果你可以调整类结构,该方案实现更简单,不需要自定义转换器:

  1. 调整ParentClass定义,用字典接收动态键的JSON对象:
public class ParentClass
{
    // 用Dictionary的Key接收动态的货币代码,Value接收InnerClass对象
    public Dictionary<string, InnerClass> Currencies { get; set; }
}
  1. 反序列化后如果需要用到原来的OuterClass结构,做一层简单映射即可:
// 先反序列化为字典结构的列表
var tempResult = JsonConvert.DeserializeObject<IList<ParentClass>>(responseBody.Content);
// 映射为你需要的OuterClass结构
var finalResult = tempResult.Select(p => new ParentClass
{
    Currencies = new OuterClass
    {
        // 取字典第一个值赋值给Inner
        Inner = p.Currencies.Values.FirstOrDefault()
    }
}).ToList();

方案对比

  • 方案1适合不能修改原有类定义的场景,逻辑内聚在转换器中,不影响上层业务代码
  • 方案2实现成本低,不需要熟悉JsonConverter的编写规则,更易排查问题

内容的提问来源于stack exchange,提问作者tonycdp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:27:02