内层属性名动态变化的JSON如何反序列化到固定C#类结构?
解决方案
问题核心是currencies字段对应的JSON对象的键是动态变化的(KGS/SOS等货币代码),无法直接映射到固定命名的Inner属性,以下是两种可行的处理方案:
方案1:自定义JsonConverter(保留原有类结构)
该方案不需要修改你已经定义的三个类的结构,通过Newtonsoft.Json的自定义转换器实现动态键的映射:
- 实现
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序列化为键为对应货币代码的对象即可 } }
- 启用转换器,二选一即可:
- 方式一:给
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:字典中转(代码量更少,易维护)
如果你可以调整类结构,该方案实现更简单,不需要自定义转换器:
- 调整
ParentClass定义,用字典接收动态键的JSON对象:
public class ParentClass { // 用Dictionary的Key接收动态的货币代码,Value接收InnerClass对象 public Dictionary<string, InnerClass> Currencies { get; set; } }
- 反序列化后如果需要用到原来的
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
相关产品推荐
相关产品推荐

