C#中通过JsonProperty将Dictionary值序列化为数组的需求
解决字典序列化为值数组的问题
这问题我之前也碰到过——默认的JSON序列化会把IDictionary<int, Simulation>转成键值对结构的对象,刚好和你想要的数组形式相反。给你几个靠谱的解决办法:
方法一:序列化时直接输出字典的Values集合
这是最简单直接的方案,不用改模型结构,就在返回前端的时候做个小处理:
如果是在ASP.NET Core控制器里,直接返回字典的Values集合转成的列表就行:
// 假设你的模型实例叫myModel return Ok(new { simulations = myModel.Simulations.Values.ToList() });
这样序列化出来的simulations就是纯值的数组,完全符合你的期望。
方法二:自定义JsonConverter实现全局序列化规则
如果想让这个字典属性不管在哪里序列化都自动变成数组,那可以写个自定义的JSON转换器,一劳永逸解决问题。
如果你用的是Newtonsoft.Json(Json.NET)
先写转换器类:
public class DictionaryValuesToArrayConverter<TKey, TValue> : JsonConverter<IDictionary<TKey, TValue>> { public override void WriteJson(JsonWriter writer, IDictionary<TKey, TValue> value, JsonSerializer serializer) { // 直接序列化字典的Values集合 serializer.Serialize(writer, value.Values); } public override IDictionary<TKey, TValue> ReadJson(JsonReader reader, Type objectType, IDictionary<TKey, TValue> existingValue, bool hasExistingValue, JsonSerializer serializer) { // 如果你需要反序列化前端传回来的数组,这里要写逻辑把数组转成字典 // 比如用Simulation里的某个唯一字段当键,或者根据需求处理 throw new NotImplementedException("反序列化逻辑需根据实际业务实现"); } public override bool CanRead => false; // 不需要反序列化的话设为false }
然后把转换器加到你的字典属性上:
[JsonProperty("Simulations")] [JsonConverter(typeof(DictionaryValuesToArrayConverter<int, Simulation>))] public IDictionary<int, Simulation> Simulations { get; set; }
如果你用的是System.Text.Json(ASP.NET Core 3.0+默认)
写法类似,先定义转换器:
public class DictionaryValuesToArrayConverter<TKey, TValue> : JsonConverter<IDictionary<TKey, TValue>> { public override void Write(Utf8JsonWriter writer, IDictionary<TKey, TValue> value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value.Values, options); } public override IDictionary<TKey, TValue> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 反序列化逻辑按需实现 throw new NotImplementedException(); } }
再给属性标记:
[JsonPropertyName("Simulations")] [JsonConverter(typeof(DictionaryValuesToArrayConverter<int, Simulation>))] public IDictionary<int, Simulation> Simulations { get; set; }
注意事项
如果你的业务需要反序列化前端传回来的数组,那得在转换器的ReadJson/Read方法里实现数组转字典的逻辑——比如用Simulation对象里的某个唯一属性作为字典的键,不然直接反序列化会报错。
内容的提问来源于stack exchange,提问作者Melchia
相关产品推荐
相关产品推荐

