2016-06-08 29 views
4

Ich habe 2 MethodenAusnahme beim Deserialisieren json

public static string SerializeObject<T>(T value) 
{ 
    if (value == null) 
    { 
     return null; 
    } 

    var dictionaryObject = new Dictionary<string, object> { { typeof(T).Name, value } }; 

    var jsonString = JsonConvert.SerializeObject(dictionaryObject); 

    return jsonString; 
} 

und

public static T DeserializeObject<T>(string jsonString) 
{ 
    var objectValue = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString); 
    return JsonConvert.DeserializeObject<T>(objectValue.Values.First().ToString()); 
} 

Wenn ich eine json Zeichenfolge mit Typ deserialisieren

ConcurrentDictionary<KeyValuePair<long, long>, IList<string>> 

Ich habe eine Ausnahme:

Co Die Zeichenkette '[1, 1]' darf nicht in den Dictionary-Schlüsseltyp 'System.Collections.Generic.KeyValuePair`2 [System.Int64, System.Int64]' konvertiert werden. Erstellen Sie einen TypeConverter, um von der Zeichenfolge in das Schlüsseltypobjekt zu konvertieren. Pfad '[1, 1]', Zeile 2, Position 12.

Kann mir also jemand den richtigen Code zeigen, damit er funktioniert?

Hier ist mein Code:

var test = new ConcurrentDictionary<KeyValuePair<long, long>, IList<string>>(); 
test.TryAdd(new KeyValuePair<long, long>(1, 1), new List<string> { "Test" }); 

var se = SerializeObject(test); 

var de = DeserializeObject<ConcurrentDictionary<KeyValuePair<long, long>, IList<string>>>(se); 
+0

warum Sie verwandeln es in ein Wörterbuch? – Toxicable

+0

Sie müssen möglicherweise etwas mehr über das, was Sie erreichen möchten, erklären. Nicht sicher, welches Problem Sie mit dem Wörterbuch lösen möchten. – d512

+0

@ user1334007: Ich versuche deserialize eine JSON-Zeichenfolge zu einem Objekt, das Typ ConcurrentDictionary hat , IList > –

Antwort

3

Ich bin nicht sicher, ob dies die beste Lösung ist, aber bitte versuchen Sie dies:

1) erstellen ContractResolver wie in this topic beschrieben.

class DictionaryAsArrayResolver : DefaultContractResolver 
     { 
      protected override JsonContract CreateContract(Type objectType) 
      { 
       if (objectType.GetInterfaces().Any(i => i == typeof(IDictionary) || 
        (i.IsGenericType && 
        i.GetGenericTypeDefinition() == typeof(IDictionary<,>)))) 
       { 
        return base.CreateArrayContract(objectType); 
       } 

       return base.CreateContract(objectType); 
      } 
     } 

2) Ändern Sie ein wenig Ihre Serialize/Deserialize Methoden:

public static string SerializeObject<T>(T value, JsonSerializerSettings settings) 
     { 
      if (value == null) 
      { 
       return null; 
      } 

      var dictionaryObject = new Dictionary<string, object> { { typeof(T).Name, value } }; 
      var jsonString = JsonConvert.SerializeObject(dictionaryObject, settings); 

      return jsonString; 
     } 

     public static T DeserializeObject<T>(string jsonString, JsonSerializerSettings settings) 
     { 
      var objectValue = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString, settings); 
      return JsonConvert.DeserializeObject<T>(objectValue.Values.First().ToString(), settings); 
     } 

3) Überprüfen Sie den Test:

[TestMethod] 
     public void Test() 
     { 
      var test = new ConcurrentDictionary<KeyValuePair<long, long>, IList<string>>(); 
      test.TryAdd(new KeyValuePair<long, long>(1, 1), new List<string> { "Test" }); 

      JsonSerializerSettings settings = new JsonSerializerSettings(); 
      settings.ContractResolver = new DictionaryAsArrayResolver(); 

      var se = SerializeObject(test, settings); 

      var de = DeserializeObject<ConcurrentDictionary<KeyValuePair<long, long>, IList<string>>>(se, settings); 
     } 

Ich hoffe, es hilft =)

+0

Es funktionierte, danke für Ihre Lösung :) @Johnny Svarog –

+0

Sie sind willkommen =) –

Verwandte Themen