2014-11-11 6 views
6

Ich habe Klasse mit einigen internen Eigenschaften und ich möchte sie in JSON auch serialisieren. Wie kann ich das erreichen? Zum BeispielJSON Serializer-Objekt mit internen Eigenschaften

public class Foo 
{ 
    internal int num1 { get; set; } 
    internal double num2 { get; set; } 
    public string Description { get; set; } 

    public override string ToString() 
    { 
     if (!string.IsNullOrEmpty(Description)) 
      return Description; 

     return base.ToString(); 
    } 
} 

es

Foo f = new Foo(); 
f.Description = "Foo Example"; 
JsonSerializerSettings settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All }; 

string jsonOutput = JsonConvert.SerializeObject(f, Formatting.Indented, settings); 

using (StreamWriter sw = new StreamWriter("json_file.json")) 
{ 
    sw.WriteLine(jsonOutput); 
} 
mit Speichern

I

{ 
"$type": "SideSlopeTest.Foo, SideSlopeTest", 
"Description": "Foo Example" 
} 
+3

Normalerweise sollen interne Eigenschaften nicht die Grenzen der aktuellen Baugruppe verlassen und somit serialisiert werden. Warum sollten Sie das tun? Wenn Sie eine korrekte JSON-Repräsentation wünschen, benötigen Sie möglicherweise ein DTO, um Ihre internen/privaten Daten zu ordnen und dann zu serialisieren. –

+0

+1 was @DarinDimitrov sagte. Aber wenn Sie es wirklich tun wollen, glaube ich, dass Sie 'DefaultContractResolver' ableiten müssen, damit es auch nicht-öffentliche Eigenschaften sieht. –

+1

mögliches Duplikat von [JSON.Net: Erzwinge die Serialisierung aller privaten Felder und aller Felder in Unterklassen] (http://stackoverflow.com/questions/24106986/json-net-force-serialization-of-all-private- fields-and-all-fields-in-classe) –

Antwort

12

Mark die inneren Eigenschaften mit dem [JsonProperty()] Attribut erhalten:

public class Foo 
{ 
    [JsonProperty()] 
    internal int num1 { get; set; } 
    [JsonProperty()] 
    internal double num2 { get; set; } 
    public string Description { get; set; } 

    public override string ToString() 
    { 
     if (!string.IsNullOrEmpty(Description)) 
      return Description; 

     return base.ToString(); 
    } 
} 

Und dann später, zu testen:

 Foo f = new Foo(); 
     f.Description = "Foo Example"; 
     f.num1 = 101; 
     f.num2 = 202; 
     JsonSerializerSettings settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All }; 

     var jsonOutput = JsonConvert.SerializeObject(f, Formatting.Indented, settings); 

     Debug.WriteLine(jsonOutput); 

bekomme ich folgende Ausgabe:

{ 
    "$type": "Tile.JsonInternalPropertySerialization.Foo, Tile", 
    "num1": 101, 
    "num2": 202.0, 
    "Description": "Foo Example" 
} 

(Wo "Tile.JsonInternalPropertySerialization" und "Tile" sind Namensraum und Montage Namen ich verwende).

+0

Ich habe gerade meine Antwort gelöscht, dass interne Eigenschaften außerhalb der Assembly nicht zugänglich sind, da dies für mich neu ist. Wie kann ein Serializer auf diese über Assemblys hinweg zugreifen? Ist das nicht ein gewisses Sicherheitsproblem? – esmoore68

+3

@ esmoore68 - Der Serializer verwendet Reflektion. Siehe z.B. https://stackoverflow.com/questions/1565734/is-it-possible-to-set-private-property-via-reflection und https://stackoverflow.com/questions/30191282/isnt-accessing-private-fields-- und-Eigenschaften-wegen-Reflexion-ein-Sicherheitsproblem. – dbc

Verwandte Themen