2014-07-10 12 views
10

ho un tipo che non controllo con più costruttori, equivalente a questa:Impossibile deserializzare classi con più costruttori con Json.NET

public class MyClass 
    { 
     private readonly string _property; 

     private MyClass() 
     { 
      Console.WriteLine("We don't want this one to be called."); 
     } 

     public MyClass(string property) 
     { 
      _property = property; 
     } 

     public MyClass(object obj) : this(obj.ToString()) {} 

     public string Property 
     { 
      get { return _property; } 
     } 

    } 

Ora in cui provo a deserializzare esso, il privato viene chiamato il convertitore parametrico e la proprietà non viene mai impostata. La prova:

[Test] 
    public void MyClassSerializes() 
    { 
     MyClass expected = new MyClass("test"); 
     string output = JsonConvert.SerializeObject(expected); 
     MyClass actual = JsonConvert.DeserializeObject<MyClass>(output); 
     Assert.AreEqual(expected.Property, actual.Property); 
    } 

dà il seguente risultato:

We don't want this one to be called. 

    Expected: "test" 
    But was: null 

Come posso risolvere il problema, senza cambiare la definizione di MyClass? Inoltre, questo tipo è una chiave in profondità nella definizione degli oggetti che ho davvero bisogno di serializzare.

risposta

5

Provare ad aggiungere l'attributo [JsonConstructor] al costruttore che si desidera utilizzare durante la deserializzazione.

cambiare questa proprietà nella classe:

[JsonConstructor] 
public MyClass(string property) 
{ 
    _property = property; 
} 

ho appena provato e il test passa :-)

Se non è possibile fare questo cambiamento, allora penso che si avrebbe bisogno di creare un CustomJsonConverter. http://james.newtonking.com/json/help/index.html?topic=html/CustomJsonConverter.htm e How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects? potrebbero aiutare.

Ecco un link utile per creare un CustomJsonConverter: https://stackoverflow.com/a/8312048/234415

+0

Grazie, purtroppo, come ho scritto nella domanda, non posso cambiare la classe. – Grzenio

+0

Quindi penso che sia necessario creare un CustomJsonConverter. Questo non è qualcosa che ho fatto, ho paura. –

+0

Prova a cercare qui: http://stackoverflow.com/a/8312048/234415 –

Problemi correlati