无需foreach,用System.Text.JSON将JSON转为Dictionary<Cottle.Value,Cottle.Value>
解决方案
一、简化Dictionary<string, string>到Dictionary<Cottle.Value, Cottle.Value>的转换
不用显式编写foreach循环,直接借助LINQ的ToDictionary方法一行完成转换,代码更简洁直观:
using System.Linq; // 假设stringDict是已生成的Dictionary<string, string> var cottleDict = stringDict.ToDictionary( kvp => Value.FromString(kvp.Key), kvp => Value.FromString(kvp.Value) );
本质仍是遍历操作,但通过LINQ封装了循环逻辑,避免手动编写重复代码。
二、用System.Text.JSON自定义转换器直接反序列化到目标类型
如果想跳过中间的Dictionary<string, string>,直接从JSON字符串反序列化为Dictionary<Cottle.Value, Cottle.Value>,可以自定义JsonConverter并集成到WebAPI的序列化配置中。
1. 实现自定义转换器
创建继承自JsonConverter<Dictionary<Cottle.Value, Cottle.Value>>的类,处理JSON的读写逻辑:
using System.Text.Json; using System.Text.Json.Serialization; using Cottle; public class CottleDictionaryConverter : JsonConverter<Dictionary<Value, Value>> { public override Dictionary<Value, Value> Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartObject) throw new JsonException("JSON格式错误,预期为对象起始"); var result = new Dictionary<Value, Value>(); while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndObject) return result; if (reader.TokenType != JsonTokenType.PropertyName) throw new JsonException("JSON格式错误,预期为属性名"); // 读取键并转为Cottle.Value var key = Value.FromString(reader.GetString()!); // 读取值(仅处理字符串类型,可根据需求扩展数字、布尔等类型) reader.Read(); if (reader.TokenType != JsonTokenType.String) throw new JsonException("仅支持字符串类型的JSON值"); var value = Value.FromString(reader.GetString()!); result.Add(key, value); } throw new JsonException("JSON格式不完整"); } public override void Write( Utf8JsonWriter writer, Dictionary<Value, Value> value, JsonSerializerOptions options) { writer.WriteStartObject(); foreach (var kvp in value) { // 将Cottle.Value转回字符串写入JSON writer.WriteString(kvp.Key.ToString(), kvp.Value.ToString()); } writer.WriteEndObject(); } }
2. 集成到WebAPI配置
在WebAPI的启动配置中,将自定义转换器添加到JSON序列化选项:
// Program.cs var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new CottleDictionaryConverter()); }); var app = builder.Build(); // 其他中间件配置... app.MapControllers(); app.Run();
3. 使用方式
配置完成后,可直接在API控制器的Action中使用Dictionary<Cottle.Value, Cottle.Value>作为参数,或在模型类中用它作为属性,System.Text.JSON会自动完成反序列化:
[HttpPost] public IActionResult ProcessTemplate([FromBody] Dictionary<Value, Value> templateData) { // 直接使用转换后的Cottle字典 return Ok(); }
若需手动反序列化JSON字符串,可传入包含转换器的选项:
var jsonString = "{\"name\":\"John\",\"age\":\"30\"}"; var options = new JsonSerializerOptions(); options.Converters.Add(new CottleDictionaryConverter()); var cottleDict = JsonSerializer.Deserialize<Dictionary<Value, Value>>(jsonString, options);
内容的提问来源于stack exchange,提问作者GI1
相关产品推荐
相关产品推荐

