2014-09-20 9 views
8

Ich verwende Newtonsoft JSON zum Serialisieren/Deserialisieren meiner Objekte. Einer davon enthält ein Array mit einem geschützten Setter, da der Konstruktor das Array selbst erstellt und nur die Mitglieder manipuliert werden.JSON Deserialize zu konstruierten geschützten Setter-Array

Dies kann ohne Probleme serialisiert werden, aber wenn es um die Deserialisierung geht, wird die Eigenschaft ignoriert, weil sie nicht öffentlich ist. Ich habe versucht, einen benutzerdefinierten Konverter mit es wird auch nicht aufgerufen, weil es nicht öffentlich ist.

Dies ist ein Minimum reduziert Beispiel:

public static class TestCoordsDeserialization 
{ 
    private class Coords 
    { 
     public Double X { get; set; } 
     public Double Y { get; set; } 
     public Double Z { get; set; } 
     public Double A { get; set; } 
    } 

    private class Engine 
    { 
     public string Text { get; set; } 
     public int Id { get; set; } 
     public Coords[] Outs { get; protected set; } 

     public Engine() 
     { 
      this.Outs = new Coords[3]; 
      for (int i = 0; i < this.Outs.Length; i++) 
      { 
       this.Outs[i] = new Coords(); 
      } 
     } 
    } 

    public static void Test() 
    { 
     Engine e = new Engine(); 
     e.Id = 42; 
     e.Text = "MyText"; 
     e.Outs[0] = new Coords() { A = 0, X = 10, Y = 11, Z = 0 }; 
     e.Outs[1] = new Coords() { A = 0, X = 20, Y = 22, Z = 0 }; 
     e.Outs[2] = new Coords() { A = 0, X = 30, Y = 33, Z = 0 }; 
     string json = JsonConvert.SerializeObject(e); 
     Console.WriteLine(json); //{"Text":"MyText","Id":42,"Positions":{"Test":9,"Outs":[{"X":10.0,"Y":11.0,"Z":0.0,"A":0.0},{"X":20.0,"Y":22.0,"Z":0.0,"A":0.0},{"X":30.0,"Y":33.0,"Z":0.0,"A":0.0}]}} 
     Engine r = JsonConvert.DeserializeObject<Engine>(json); 
     double value = r.Outs[1].X; // should be '20.0' 
     Console.WriteLine(value); 
     Debugger.Break(); 
    } 
} 

Wie kann ich value machen 20,0 werden?

+1

einige Ideen hier: http://dotbrand.wordpress.com/2010/07/05/entities-with-privateprotected-setters-in-ravendb/ – dbc

Antwort

14

Mark Outs mit dem [JsonProperty] Attribut:

private class Engine 
    { 
     public string Text { get; set; } 
     public int Id { get; set; } 
     [JsonProperty] // Causes the protected setter to be called on deserialization. 
     public Coords[] Outs { get; protected set; } 

     public Engine() 
     { 
      this.Outs = new Coords[3]; 
      for (int i = 0; i < this.Outs.Length; i++) 
      { 
       this.Outs[i] = new Coords(); 
      } 
     } 
    } 
+0

Unglaublich einfach! Hat meine Aufmerksamkeit in den Dokumenten ... – ZoolWay