如何将指定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
相关产品推荐
相关产品推荐

