这可能有点迟,但可以使用JsonConverter
来扩展生成的JSON会稍微复杂一些,但是更加灵活。我创建了所描述的情形下的样品,它不是完全
.NET Fiddle - Try It
(随意扩展,如果你决定使用它):
public class DictConverter<TValue> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var obj = JToken.ReadFrom(reader);
if (objectType == typeof(Dictionary<string, TValue>))
{
var comparer = obj.Value<string>("Comparer");
Dictionary<string, TValue> result;
if (comparer == "OrdinalIgnoreCase")
{
result = new Dictionary<string, TValue>(StringComparer.OrdinalIgnoreCase);
}
else
{
result = new Dictionary<string, TValue>();
}
obj["Comparer"].Parent.Remove();
serializer.Populate(obj.CreateReader(), result);
return result;
}
return obj.ToObject(objectType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var obj = JObject.FromObject(value);
if (value is Dictionary<string, TValue>)
{
if((value as Dictionary<string, TValue>).Comparer == StringComparer.OrdinalIgnoreCase)
obj.Add("Comparer", JToken.FromObject("OrdinalIgnoreCase"));
}
obj.WriteTo(writer);
}
}
和使用
var dict = new Dictionary<string, Dictionary<string, string>>(StringComparer.OrdinalIgnoreCase);
dict["x"] = new Dictionary<string, string>();
dict["x"]["y"] = "something";
var serialized = JsonConvert.SerializeObject(dict,
new DictConverter<Dictionary<string,string>>());
var unSerialized = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>
(serialized, new DictConverter<Dictionary<string, string>>());
OK ,罗恩,假设你把这个json发送到另一个站点。它如何知道你是如何构建这个词典的(你甚至可以使用其他方法而不需要任何字典来创建相同的json) –
@ L.B这个应用程序不是基于web的,我使用JSON进行序列化,以实现其他商业原因。数据不会被外部系统处理。 –
这只是一个例子来解释逻辑。 json的接收者不知道你是如何创建它的。它甚至不知道你用来创建它的语言。所以你做出错误的假设 –