如何用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
相关产品推荐
相关产品推荐

