序列化List<KeyValuePair>时如何去除'Key'/'Value'字段?
解决方案
你当前使用KeyValuePair<string, int>存储数据,序列化时会默认输出它的Key和Value属性,所以得到的是带这两个字段的JSON结构。要生成目标格式,只需更换存储数据的结构即可,以下是几种简单高效的实现方式:
方法一:使用匿名类型(一次性场景推荐)
直接通过LINQ将每个元素转换为包含ID字段的匿名对象,无需手动循环:
// 直接生成目标结构的列表 var deletionBody = _elementList.Select(item => new { ID = item }).ToList(); // 序列化后得到目标格式 string json = JsonConvert.SerializeObject(deletionBody);
序列化结果:
[{"ID":8000},{"ID":8001}]
方法二:定义自定义类(复用场景推荐)
如果这个数据结构需要在多处使用,建议定义一个明确的类,提升代码可读性和可维护性:
// 定义类 public class IdEntity { public int ID { get; set; } } // 生成列表 var deletionBody = _elementList.Select(item => new IdEntity { ID = item }).ToList(); // 序列化 string json = JsonConvert.SerializeObject(deletionBody);
不推荐的复杂方式(自定义转换器)
如果一定要保留KeyValuePair结构,需要编写自定义JSON转换器,但这种方式没必要,会增加代码复杂度,仅作参考:
public class KeyValuePairConverter : JsonConverter<KeyValuePair<string, int>> { public override void WriteJson(JsonWriter writer, KeyValuePair<string, int> value, JsonSerializer serializer) { writer.WriteStartObject(); writer.WritePropertyName(value.Key); writer.WriteValue(value.Value); writer.WriteEndObject(); } public override KeyValuePair<string, int> ReadJson(JsonReader reader, Type objectType, KeyValuePair<string, int> existingValue, bool hasExistingValue, JsonSerializer serializer) { // 反序列化逻辑(如果需要的话) var jObj = JObject.Load(reader); var key = jObj.Properties().First().Name; var val = (int)jObj.Properties().First().Value; return new KeyValuePair<string, int>(key, val); } } // 使用转换器序列化 var settings = new JsonSerializerSettings(); settings.Converters.Add(new KeyValuePairConverter()); string json = JsonConvert.SerializeObject(_deletionBody, settings);
最优实现建议
优先选择方法一(匿名类型+LINQ),代码最简洁,完全满足需求;如果需要重复使用该数据结构,再考虑方法二的自定义类方案。
内容的提问来源于stack exchange,提问作者Soumya
相关产品推荐
相关产品推荐

