如何将含动态键值对的JSON反序列化为Parameter类?
动态映射JSON动态字段到C# Parameter类
问题背景
现有如下JSON结构:
{ "ruleName": "PhoneNumber", "ruleSetInput": [ { "PersonCode": "85782", "PhoneTypeId": "1", "PhoneClassId": "0", "DiallingCode": "021", "PhoneNumber": "9321662", "Extension": "", "Status": "", "User": "2", "DateCapturd": "" } ] }
其中ruleSetInput节点下的字段并非固定,需要将该节点内每个对象的键值对映射到如下C#类:
public class Parameter { public string Name { get; set; } public string Value { get; set; } [JsonIgnore] public int Type { get; set; } }
例如生成的Parameter列表需包含:
Name: "PersonCode", Value: "85782"
尝试过Newtonsoft.Json,但误以为该工具仅能适配固定结构的反序列化,询问如何实现这种动态映射。
解决方案
Newtonsoft.Json完全支持动态JSON结构的处理,以下两种方法可以实现需求:
方法一:使用JObject/JArray直接遍历处理
通过解析JSON为JObject,直接遍历ruleSetInput内的属性键值对,手动构建Parameter对象:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Collections.Generic; // 假设jsonStr为你的JSON字符串 var jsonObject = JObject.Parse(jsonStr); var ruleSetInputArray = jsonObject["ruleSetInput"] as JArray; List<Parameter> parameterList = new List<Parameter>(); foreach (JObject item in ruleSetInputArray) { foreach (var property in item.Properties()) { parameterList.Add(new Parameter { Name = property.Name, Value = property.Value.ToString() }); } }
方法二:自定义JsonConverter实现自动反序列化
如果希望直接将JSON反序列化为包含Parameter列表的强类型对象,可以自定义转换器:
- 定义根对象并标记转换器:
public class RuleRoot { public string ruleName { get; set; } [JsonConverter(typeof(RuleSetInputConverter))] public List<Parameter> ruleSetInput { get; set; } }
- 实现自定义转换器:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; public class RuleSetInputConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(List<Parameter>); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var parameterList = new List<Parameter>(); var inputArray = JArray.Load(reader); foreach (JObject obj in inputArray) { foreach (var prop in obj.Properties()) { parameterList.Add(new Parameter { Name = prop.Name, Value = prop.Value.ToString() }); } } return parameterList; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // 若需要将Parameter列表序列回原始JSON格式,可实现此方法 var parameters = value as List<Parameter>; var itemObj = new JObject(); foreach (var param in parameters) { itemObj.Add(param.Name, param.Value); } new JArray(itemObj).WriteTo(writer); } }
- 使用转换器反序列化:
var ruleRoot = JsonConvert.DeserializeObject<RuleRoot>(jsonStr); // ruleRoot.ruleSetInput即为转换后的Parameter列表
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

