這可能有點遲,但可以使用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的接收者不知道你是如何創建它的。它甚至不知道你用來創建它的語言。所以你做出錯誤的假設 –