2014-02-28 6 views
7

Ich verwende Newtonsoft.Json zum Serialisieren/Deserialisieren von Objekten.
Soweit ich weiß, kann eine Deserialisierung nicht erfolgreich sein, wenn die Klasse keinen parameterlosen Konstruktor hat. BeispielKann ich eine strikte Deserialisierung mit Newtonsoft.Json vornehmen?

public class Dog 
{ 
    public string Name; 

    public Dog(string n) 
    { 
     Name = n; 
    } 
} 

Für diese Klasse unterhalb Code generiert das Objekt korrekt.

Dog dog1 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dog>("{\"Name\":\"Dog1\"}"); 

Für mich, überraschend generiert es das Objekt korrekt mit unter Codes auch.

Dog dog2 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dog>("{\"name\":\"Dog2\"}"); 
Dog dog3 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dog>("{\"n\":\"Dog3\"}"); 
Dog dog4 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dog>("{\"N\":\"Dog4\"}"); 

Jetzt alles, was ich denken kann, ist

  1. Json Wandlergehäuse-Empfindlichkeit wird ignoriert, während Reflexion zu tun.
  2. Außerdem, wenn es einem Konstruktor gegenübersteht, füllt es Parameter mit JSON-String (als ob die Parameternamen in JSON-String sind). Ich bin mir nicht sicher, aber vielleicht nennen sie das so flexibel.

Hier meine Frage kommt:

Wenn meine Klasse so etwas wie das ist,

public class Dog 
{ 
    public string Name; 

    public Dog(string name) 
    { 
     Name = name + "aaa"; 
    } 
} 

und zum Erzeugen von Objekt mit

Dog dog1 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dog>("{\"Name\":\"Dog1\"}"); 

dann erstellte Objekt gibt mir dog1.Name = "Dog1aaa" statt dog1.Name = "Dog1" . Wie kann ich das Objekt korrekt deserialisieren (möglicherweise nach dem Erstellen des Objekts Name überschreiben)? Gibt es einen Weg für eine strenge Deserialisierung?

Vielen Dank im Voraus

Antwort

7

Wie kann ich Deserialisieren das Objekt richtig (vielleicht Namen überschreiben, nachdem das Objekt erstellen)? Gibt es einen Weg für eine strenge Deserialisierung?

Sie können einen anderen Konstruktor deklarieren und Json.Net es

public class Dog 
{ 
    public string Name; 

    [JsonConstructor] 
    public Dog() 
    { 

    } 

    public Dog(string name) 
    { 
     Name = name + "aaa"; 
    } 
} 
+1

Es funktionierte gut, auch wenn ich JsonConstructor der Modifikator auf private ändern. Newtonsoft erstellt irgendwie immer noch das Objekt mit diesem. – serdar

-1

Mit etwas zu verwenden, zwingen wie diese

JsonConvert.DeserializeObject("json string", typeof(some object));