Guest User

Untitled

a guest
Dec 14th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.01 KB | None | 0 0
  1. // UPDATE!
  2. // In Json.NET 7, a DictionaryKeyResolver was added.
  3. // This might be able to fix the problem more elegantly.
  4. // I haven't checked though.
  5.  
  6. public class DictionaryJsonConverter : JsonConverter
  7. {
  8. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  9. {
  10. var dictionary = (IDictionary)value;
  11.  
  12. writer.WriteStartArray();
  13.  
  14. foreach (var key in dictionary.Keys)
  15. {
  16. writer.WriteStartObject();
  17.  
  18. writer.WritePropertyName("Key");
  19.  
  20. serializer.Serialize(writer, key);
  21.  
  22. writer.WritePropertyName("Value");
  23.  
  24. serializer.Serialize(writer, dictionary[key]);
  25.  
  26. writer.WriteEndObject();
  27. }
  28.  
  29. writer.WriteEndArray();
  30. }
  31.  
  32. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  33. {
  34. if (!CanConvert(objectType))
  35. throw new Exception(string.Format("This converter is not for {0}.", objectType));
  36.  
  37. var keyType = objectType.GetGenericArguments()[0];
  38. var valueType = objectType.GetGenericArguments()[1];
  39. var dictionaryType = typeof(Dictionary<,>).MakeGenericType(keyType, valueType);
  40. var result = (IDictionary)Activator.CreateInstance(dictionaryType);
  41.  
  42. if (reader.TokenType == JsonToken.Null)
  43. return null;
  44.  
  45. while (reader.Read())
  46. {
  47. if (reader.TokenType == JsonToken.EndArray)
  48. {
  49. return result;
  50. }
  51.  
  52. if (reader.TokenType == JsonToken.StartObject)
  53. {
  54. AddObjectToDictionary(reader, result, serializer, keyType, valueType);
  55. }
  56. }
  57.  
  58. return result;
  59. }
  60.  
  61. public override bool CanConvert(Type objectType)
  62. {
  63. return objectType.IsGenericType && (objectType.GetGenericTypeDefinition() == typeof(IDictionary<,>) || objectType.GetGenericTypeDefinition() == typeof(Dictionary<,>));
  64. }
  65.  
  66. private void AddObjectToDictionary(JsonReader reader, IDictionary result, JsonSerializer serializer, Type keyType, Type valueType)
  67. {
  68. object key = null;
  69. object value = null;
  70.  
  71. while (reader.Read())
  72. {
  73. if (reader.TokenType == JsonToken.EndObject && key != null)
  74. {
  75. result.Add(key, value);
  76. return;
  77. }
  78.  
  79. var propertyName = reader.Value.ToString();
  80. if (propertyName == "Key")
  81. {
  82. reader.Read();
  83. key = serializer.Deserialize(reader, keyType);
  84. }
  85. else if (propertyName == "Value")
  86. {
  87. reader.Read();
  88. value = serializer.Deserialize(reader, valueType);
  89. }
  90. }
  91. }
  92. }
Add Comment
Please, Sign In to add comment