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

如何将指定JSON反序列化为NameValuePair<string, string>列表?代码返回null

解决JSON反序列化为KeyValuePair列表时返回null的问题

首先,你的问题根源在于大小写不匹配:KeyValuePair<string, string>的内置属性是Key和Value(首字母大写),但你的JSON字段是小写的key和value。JavaScriptSerializer默认严格区分大小写,导致无法完成属性映射,最终返回的列表元素都是null。

下面给你几种实用的解决办法:

方法1:调整JSON字段名(若可控制JSON源)

如果能修改JSON的格式,把字段改成大写开头的Key和Value,你原来的代码就能直接正常工作:

[{"Key":"key1","Value":"val1"},{"Key":"key2","Value":"val2"}]

方法2:用自定义类做中间转换(无需修改JSON)

如果没法调整JSON,先反序列化成和JSON字段完全匹配的自定义类,再转换成KeyValuePair列表:

// 定义与JSON字段匹配的中转类
public class KeyValueDto
{
    public string key { get; set; }
    public string value { get; set; }
}

// 执行反序列化并转换
var json = "[{\"key\":\"key1\",\"value\":\"val1\"},{\"key\":\"key2\",\"value\":\"val2\"}]";
var serializer = new JavaScriptSerializer();
var dtoList = serializer.Deserialize<List<KeyValueDto>>(json);
var result = dtoList.Select(dto => new KeyValuePair<string, string>(dto.key, dto.value)).ToList();

方法3:自定义JavaScriptConverter(适配场景复用)

如果需要频繁处理这类大小写不匹配的KeyValuePair反序列化,可以写一个自定义转换器:

public class KeyValuePairConverter : JavaScriptConverter
{
    public override IEnumerable<Type> SupportedTypes
    {
        get { return new List<Type> { typeof(KeyValuePair<string, string>) }; }
    }

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        if (dictionary.TryGetValue("key", out var keyObj) && dictionary.TryGetValue("value", out var valueObj))
        {
            return new KeyValuePair<string, string>(keyObj as string, valueObj as string);
        }
        return default(KeyValuePair<string, string>);
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        // 若不需要序列化功能,可暂时抛出异常或返回空字典
        throw new NotImplementedException();
    }
}

// 注册并使用转换器
var json = "[{\"key\":\"key1\",\"value\":\"val1\"},{\"key\":\"key2\",\"value\":\"val2\"}]";
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new List<JavaScriptConverter> { new KeyValuePairConverter() });
var result = serializer.Deserialize<List<KeyValuePair<string, string>>>(json);

额外提一句:如果项目允许切换到Newtonsoft.Json(Json.NET),处理会更省心——它默认支持大小写不敏感匹配,一行代码就能搞定:

var result = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:05:39