2014-07-10 17 views
10

I Klassen mit mehreren Konstrukteuren deserialisieren haben einen Typ, der ich mit mehreren Konstrukteuren nicht, das entspricht diese Kontrolle:kann nicht mit 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; } 
     } 

    } 

Jetzt, wenn ich versuche, es zu deserialisieren, die private Der parameterlose Konstruktor wird aufgerufen, und die Eigenschaft wird niemals festgelegt. Der 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); 
    } 

gibt die folgende Ausgabe:

We don't want this one to be called. 

    Expected: "test" 
    But was: null 

Wie kann ich das Problem beheben, ohne die Definition von MyClass zu ändern? Außerdem ist dieser Typ ein Schlüssel in der Definition der Objekte, die ich wirklich serialisieren muss.

Antwort

5

Versuchen Sie, das Attribut [JsonConstructor] dem Konstruktor hinzuzufügen, den Sie beim Deserialisieren verwenden möchten.

Ändern Sie diese Eigenschaft in der Klasse:

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

Ich habe versucht, es einfach und Ihr Test bestanden :-)

Wenn Sie diese Änderung vornehmen kann dann denke ich, Sie bräuchten Erstellen Sie eine CustomJsonConverter. http://james.newtonking.com/json/help/index.html?topic=html/CustomJsonConverter.htm und How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects? könnte helfen.

Hier ist eine nützliche Verbindung für eine CustomJsonConverter erstellen: https://stackoverflow.com/a/8312048/234415

+0

Danke, leider, wie ich in der Frage schrieb, kann ich nicht die Klasse ändern. – Grzenio

+0

Dann denke ich, dass Sie einen CustomJsonConverter erstellen müssen. Das ist nicht etwas, was ich getan habe, fürchte ich. –

+0

Versuchen Sie, hier zu suchen: http://StackOverflow.com/a/8312048/234415 –

Verwandte Themen