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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:02:22