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

序列化Dictionary<string, string[]>时将单元素数组转为字符串的实现方案

解决方法:自定义JsonConverter处理单元素数组转字符串

嘿,这个需求完全可以通过Newtonsoft.Json的自定义Json转换器来实现,直接控制序列化逻辑就行。下面是具体的实现方案:

步骤1:创建自定义Json转换器

我们需要写一个继承自JsonConverter的类,在序列化时判断数组长度——当只有一个元素时直接输出字符串,否则保留数组格式:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;

public class SingleElementArrayConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // 只针对字符串数组类型生效
        return objectType == typeof(string[]);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        string[] array = (string[])value;
        if (array.Length == 1)
        {
            // 单元素直接序列化字符串
            serializer.Serialize(writer, array[0]);
        }
        else
        {
            // 多元素正常序列化数组
            serializer.Serialize(writer, array);
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 配套反序列化逻辑:如果是字符串就转成单元素数组,数组则直接读取
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.String)
        {
            return new string[] { token.ToString() };
        }
        else if (token.Type == JTokenType.Array)
        {
            return token.ToObject<string[]>();
        }
        throw new JsonSerializationException("Unexpected token type for string array");
    }
}

步骤2:序列化时启用自定义转换器

调用JsonConvert.SerializeObject时,把自定义转换器传入序列化配置即可:

// 初始化字典并添加测试数据
Dictionary<string, string[]> dict = new Dictionary<string, string[]>
{
    { "Number", new[] { "123" } },
    { "Names", new[] { "John", "Harry" } }
};

// 配置序列化参数,添加自定义转换器
JsonSerializerSettings settings = new JsonSerializerSettings
{
    Converters = new List<JsonConverter> { new SingleElementArrayConverter() },
    Formatting = Formatting.Indented // 可选:格式化输出方便查看
};

// 执行序列化
string json = JsonConvert.SerializeObject(dict, settings);
Console.WriteLine(json);

最终输出结果

运行代码后会得到你期望的格式:

{
  "Number": "123",
  "Names": [
    "John",
    "Harry"
  ]
}

补充说明

  • 这个转换器仅作用于string[]类型,不会干扰其他数据类型的序列化
  • 如果字典中存在其他类型的数组,可以修改CanConvert方法扩展适配范围
  • 反序列化逻辑已经内置,后续如果需要把JSON转回字典,也能正确处理单元素字符串转数组的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:18:53