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

如何将含动态键值对的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列表的强类型对象,可以自定义转换器:

  1. 定义根对象并标记转换器:
public class RuleRoot
{
    public string ruleName { get; set; }
    [JsonConverter(typeof(RuleSetInputConverter))]
    public List<Parameter> ruleSetInput { get; set; }
}
  1. 实现自定义转换器:
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);
    }
}
  1. 使用转换器反序列化:
var ruleRoot = JsonConvert.DeserializeObject<RuleRoot>(jsonStr);
// ruleRoot.ruleSetInput即为转换后的Parameter列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:35:17