Tôi tin rằng cách duy nhất là tạo JsonConverter cho toàn bộ loại Dictionary<MyEnum, int>
hoặc Dictionary<MyEnum, T>
.
Khóa từ điển không được coi là giá trị và sẽ không được chạy qua JsonConverters. TypeConverters sẽ là một giải pháp, nhưng chuỗi mặc định để chuyển đổi enum sẽ nhập trước khi nó nhìn vào TypeConverters.
Vì vậy ... Tôi không nghĩ rằng nó có thể được thực hiện theo bất kỳ cách nào khác.
EDIT:
Không kiểm tra đầy đủ, nhưng tôi sử dụng một cái gì đó như thế này trong một dự án của tôi:
public class DictionaryWithSpecialEnumKeyConverter : JsonConverter
{
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotSupportedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var valueType = objectType.GetGenericArguments()[1];
var intermediateDictionaryType = typeof(Dictionary<,>).MakeGenericType(typeof(string), valueType);
var intermediateDictionary = (IDictionary)Activator.CreateInstance(intermediateDictionaryType);
serializer.Populate(reader, intermediateDictionary);
var finalDictionary = (IDictionary)Activator.CreateInstance(objectType);
foreach (DictionaryEntry pair in intermediateDictionary)
finalDictionary.Add(Enum.Parse(MyEnum, "Code" + pair.Key, false), pair.Value);
return finalDictionary;
}
public override bool CanConvert(Type objectType)
{
return objectType.IsA(typeof(IDictionary<,>)) &&
objectType.GetGenericArguments()[0].IsA<MyEnum>();
}
}
Bạn sẽ cần helper ít này:
public static bool IsA(this Type type, Type typeToBe)
{
if (!typeToBe.IsGenericTypeDefinition)
return typeToBe.IsAssignableFrom(type);
var toCheckTypes = new List<Type> { type };
if (typeToBe.IsInterface)
toCheckTypes.AddRange(type.GetInterfaces());
var basedOn = type;
while (basedOn.BaseType != null)
{
toCheckTypes.Add(basedOn.BaseType);
basedOn = basedOn.BaseType;
}
return toCheckTypes.Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeToBe);
}
Hy vọng nó hoạt động cho bạn.
Điều này đặc biệt hữu ích khi sử dụng Json.Net trên nền tảng điện thoại di động kể từ TypeConverters không được hỗ trợ, và điều này tiếp cận là cần thiết cho ví dụ. cấu trúc như các phím quá. –
cách sử dụng trình chuyển đổi của bạn một cách chính xác? Tôi có json tương tự. Và tôi muốn loại bỏ nó vào lớp tiếp theo: 'lớp công khai InsightsReportDataMetric { [JsonProperty (" programs ")] Public InsightsReportDataPrograms [] Programs {get; bộ; } = InsightsReportDataPrograms mới [0]; [JsonProperty ("ngày")] chuỗi công cộng Ngày {get; bộ; } [JsonConverter (typeof (InsightsMetricConverter))] từ điển công khai MetricValues {get; bộ; } } 'nhưng trong trình chuyển đổi mẫu của tôi không bao giờ đạt được ... –
demo