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

如何用Newtonsoft.Json自动将指定JSON反序列化为Dictionary<string,string>

直接将指定JSON结构反序列化为Dictionary<string, string>的方法

你可以通过自定义序列化转换器,直接将JSON中的AdditionalProperties数组映射为Dictionary<string, string>,无需额外定义中转属性。以下是两种主流序列化库的实现方案:

方案一:使用Newtonsoft.Json(Json.NET)

1. 定义自定义转换器

public class KeyValueListToDictionaryConverter : JsonConverter<Dictionary<string, string>>
{
    public override Dictionary<string, string> ReadJson(JsonReader reader, Type objectType, Dictionary<string, string> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var dict = new Dictionary<string, string>();
        if (reader.TokenType == JsonToken.StartArray)
        {
            var jArray = JArray.Load(reader);
            foreach (var jObj in jArray.Cast<JObject>())
            {
                var key = jObj["Key"]?.ToString();
                var value = jObj["Value"]?.ToString();
                if (!string.IsNullOrEmpty(key))
                {
                    dict[key] = value;
                }
            }
        }
        return dict;
    }

    public override void WriteJson(JsonWriter writer, Dictionary<string, string> value, JsonSerializer serializer)
    {
        writer.WriteStartArray();
        foreach (var kv in value)
        {
            writer.WriteStartObject();
            writer.WritePropertyName("Key");
            writer.WriteValue(kv.Key);
            writer.WritePropertyName("Value");
            writer.WriteValue(kv.Value);
            writer.WriteEndObject();
        }
        writer.WriteEndArray();
    }
}

2. 在Payload类中标记属性

public class Payload
{
    [JsonConverter(typeof(KeyValueListToDictionaryConverter))]
    public Dictionary<string, string> AdditionalProperties { get; set; }
}

3. 反序列化示例

var json = @"{""Payload"": {""AdditionalProperties"": [{""Key"": ""MyKey1"", ""Value"": ""Value""}, {""Key"": ""MyKey2"", ""Value"": ""Value""}]}}";
var payload = JsonConvert.DeserializeObject<Payload>(json);
// payload.AdditionalProperties即为Dictionary<string, string>类型

方案二:使用System.Text.Json(.NET Core/.NET 5+内置)

1. 定义自定义转换器

public class KeyValueListToDictionaryConverter : JsonConverter<Dictionary<string, string>>
{
    public override Dictionary<string, string> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var dict = new Dictionary<string, string>();
        if (reader.TokenType == JsonTokenType.StartArray)
        {
            while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
            {
                if (reader.TokenType == JsonTokenType.StartObject)
                {
                    string key = null;
                    string value = null;
                    while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
                    {
                        if (reader.TokenType == JsonTokenType.PropertyName)
                        {
                            var propName = reader.GetString();
                            reader.Read();
                            if (propName == "Key")
                            {
                                key = reader.GetString();
                            }
                            else if (propName == "Value")
                            {
                                value = reader.GetString();
                            }
                        }
                    }
                    if (!string.IsNullOrEmpty(key))
                    {
                        dict[key] = value;
                    }
                }
            }
        }
        return dict;
    }

    public override void Write(Utf8JsonWriter writer, Dictionary<string, string> value, JsonSerializerOptions options)
    {
        writer.WriteStartArray();
        foreach (var kv in value)
        {
            writer.WriteStartObject();
            writer.WriteString("Key", kv.Key);
            writer.WriteString("Value", kv.Value);
            writer.WriteEndObject();
        }
        writer.WriteEndArray();
    }
}

2. 在Payload类中标记属性

public class Payload
{
    [JsonConverter(typeof(KeyValueListToDictionaryConverter))]
    public Dictionary<string, string> AdditionalProperties { get; set; }
}

3. 反序列化示例

var json = @"{""Payload"": {""AdditionalProperties"": [{""Key"": ""MyKey1"", ""Value"": ""Value""}, {""Key"": ""MyKey2"", ""Value"": ""Value""}]}}";
var payload = JsonSerializer.Deserialize<Payload>(json);
// payload.AdditionalProperties直接为Dictionary<string, string>类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:54:33