参见英文答案 >
Serialize dictionary as array (of key value pairs)5个
如何使Json.NET序列化器序列化IDictionary<,>实例到具有键/值属性的对象数组?
默认情况下,它将Key的值序列化为JSON对象的属性名称.
如何使Json.NET序列化器序列化IDictionary<,>实例到具有键/值属性的对象数组?
默认情况下,它将Key的值序列化为JSON对象的属性名称.
基本上我需要这样的东西:
[{"key":"some key","value":1},{"key":"another key","value":5}]
代替:
{{"some key":1},{"another key":5}}
我试图将KeyValuePairConverter添加到序列化程序设置,但它没有任何效果. (我发现这个转换器因IDictionary<>的类型而被忽略,但我不能轻易地改变我的对象的类型,因为它们是从其他库接收的,因此从IDictionary<>到ICollection< KeyValuePair<>>的更改不是我的选择.)
我能够让这个转换器工作.
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Converters; public class CustomDictionaryConverter : JsonConverter { public override bool CanConvert(Type objectType) { return (typeof(IDictionary).IsAssignableFrom(objectType) || TypeImplementsGenericInterface(objectType,typeof(IDictionary<,>))); } private static bool TypeImplementsGenericInterface(Type concreteType,Type interfaceType) { return concreteType.GetInterfaces() .Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == interfaceType); } public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer) { Type type = value.GetType(); IEnumerable keys = (IEnumerable)type.GetProperty("Keys").GetValue(value,null); IEnumerable values = (IEnumerable)type.GetProperty("Values").GetValue(value,null); IEnumerator valueEnumerator = values.GetEnumerator(); writer.WriteStartArray(); foreach (object key in keys) { valueEnumerator.MoveNext(); writer.WriteStartObject(); writer.WritePropertyName("key"); writer.WriteValue(key); writer.WritePropertyName("value"); serializer.Serialize(writer,valueEnumerator.Current); writer.WriteEndObject(); } writer.WriteEndArray(); } public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer) { throw new NotImplementedException(); } }
以下是使用转换器的示例:
IDictionary<string,int> dict = new Dictionary<string,int>(); dict.Add("some key",1); dict.Add("another key",5); string json = JsonConvert.SerializeObject(dict,new CustomDictionaryConverter()); Console.WriteLine(json);
这是上面的输出:
[{"key":"some key","value":5}]