2014-07-10 12 views
10

mam typu, że nie kontrolują z wielu konstruktorów, co odpowiada tej jednej:Nie deserializacji klas z wielu konstruktorów z 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; } 
     } 

    } 

Teraz, gdy próbuję go deserializowania, prywatny bez parametrów jest wywoływany, a właściwość nigdy nie jest ustawiona. Test:

[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); 
    } 

daje następujący wynik:

We don't want this one to be called. 

    Expected: "test" 
    But was: null 

Jak mogę to naprawić, bez zmiany definicji MyClass? Ponadto ten typ jest kluczem głęboko w definicji obiektów, które naprawdę muszę serializować.

Odpowiedz

5

Spróbuj dodać atrybut [JsonConstructor] do konstruktora, którego chcesz użyć podczas deserializacji.

Zmiana ta właściwość w swojej klasie:

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

Właśnie spróbowałem i nasz test przechodzi :-)

Jeśli nie można dokonać tej zmiany, to chyba trzeba by Utwórz CustomJsonConverter. http://james.newtonking.com/json/help/index.html?topic=html/CustomJsonConverter.htm i How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects? mogą pomóc.

Oto przydatny link tworząc CustomJsonConverter: https://stackoverflow.com/a/8312048/234415

+0

Dzięki, niestety, jak napisałem w pytaniu, nie mogę zmienić klasę. – Grzenio

+0

Następnie myślę, że potrzebujesz stworzyć CustomJsonConverter. To nie jest coś, co zrobiłem Obawiam się. –

+0

Spróbuj wyszukać tutaj: http://stackoverflow.com/a/8312048/234415 –

Powiązane problemy