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

.NET Core控制器中实现JSON数组转字符串列表绑定(无需额外类)

实现JSON数组到字符串列表的直接绑定(无需中间类)

完全可以通过自定义JSON转换器结合属性特性实现,不需要创建仅含value字段的中间类。以下是针对.NET Core默认使用的System.Text.Json的解决方案:

1. 自定义JSON转换器

创建一个继承自JsonConverter<List<string>>的转换器类,负责将[{"value": "xxx"}]格式的JSON数组转换为List<string>:

using System.Text.Json;
using System.Text.Json.Serialization;

public class ValueArrayToStringListConverter : JsonConverter<List<string>>
{
    public override List<string>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType != JsonTokenType.StartArray)
            throw new JsonException("JSON数组格式错误");

        var stringList = new List<string>();
        while (reader.Read())
        {
            if (reader.TokenType == JsonTokenType.EndArray)
                break;

            if (reader.TokenType != JsonTokenType.StartObject)
                throw new JsonException("数组元素应为包含value字段的对象");

            string? value = null;
            while (reader.Read())
            {
                if (reader.TokenType == JsonTokenType.EndObject)
                    break;

                if (reader.TokenType == JsonTokenType.PropertyName && reader.GetString() == "value")
                {
                    reader.Read();
                    value = reader.GetString();
                }
                else
                {
                    // 跳过对象中其他无关属性
                    reader.Skip();
                }
            }

            if (value != null)
                stringList.Add(value);
        }

        return stringList;
    }

    public override void Write(Utf8JsonWriter writer, List<string>? value, JsonSerializerOptions options)
    {
        if (value == null)
        {
            writer.WriteNullValue();
            return;
        }

        writer.WriteStartArray();
        foreach (var item in value)
        {
            writer.WriteStartObject();
            writer.WriteString("value", item);
            writer.WriteEndObject();
        }
        writer.WriteEndArray();
    }
}

2. 在模型属性上应用转换器

修改DataModel类,给b属性添加[JsonConverter]特性,指定使用上面的转换器:

public class DataModel
{
    public string? a { get; set; }
    
    [JsonConverter(typeof(ValueArrayToStringListConverter))]
    public List<string>? b { get; set; }
}

3. 控制器方法无需修改

原控制器方法保持不变,框架会自动使用转换器完成绑定:

public async Task<IActionResult> UploadData(List<DataModel> values) 
{
    // 处理业务逻辑
    return Ok(values);
}

补充:若使用Newtonsoft.Json(Json.NET)

如果项目配置了使用Newtonsoft.Json作为序列化器,可创建对应的转换器:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class NewtonsoftValueArrayToStringListConverter : JsonConverter<List<string>>
{
    public override List<string>? ReadJson(JsonReader reader, Type objectType, List<string>? existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var array = JArray.Load(reader);
        return array.Select(item => item["value"]?.ToString()).Where(v => v != null).ToList()!;
    }

    public override void WriteJson(JsonWriter writer, List<string>? value, JsonSerializer serializer)
    {
        if (value == null)
        {
            writer.WriteNull();
            return;
        }

        writer.WriteStartArray();
        foreach (var item in value)
        {
            writer.WriteStartObject();
            writer.WritePropertyName("value");
            writer.WriteValue(item);
            writer.WriteEndObject();
        }
        writer.WriteEndArray();
    }
}

然后在属性上使用[Newtonsoft.Json.JsonConverter]特性即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:40:32