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

无需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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:10:40