.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
相关产品推荐
相关产品推荐

