2015-11-17 15 views
5

Utilizzo il serializzatore JSON di Newtonsoft e la stringa serializzata manca delle proprietà dalla classe derivata se la classe è derivata da un elenco. Ecco il mio codice di esempio.Proprietà di serializzazione JSON mancanti nella classe derivata

Classi:

[DataContract] 
public class TestItem 
{ 
    [DataMember] 
    public int itemInt; 
    [DataMember] 
    public string itemString; 

    public TestItem() {} 
    public TestItem(int _intVal, string _stringVal) 
    { 
     itemInt = _intVal; 
     itemString = _stringVal; 
    } 
} 

[DataContract] 
public class TestMain : List<TestItem> 
{ 
    [DataMember] 
    public int mainInt; 
    [DataMember] 
    public string mainString; 
} 

codice di serializzazione:

string test; 

// Test classes 
TestMain main = new TestMain(); 
main.mainInt = 123; 
main.mainString = "Hello"; 
main.Add(new TestItem(1, "First")); 

test = Newtonsoft.Json.JsonConvert.SerializeObject(main); 

Dopo la serializzazione, il valore di test è:

[{\ "itemInt \": 1, \" itemString \ ": \" Prima \ "}]

I valori per mainInt e mainString mancano del tutto.

Il comportamento non viene modificato dai tag [DataContract] e [DataMember], ma li ho inseriti li, per evitare la risposta che mancano.

Come posso ottenere JSON per riconoscere e serializzare le proprietà mainInt e mainString della classe derivata?

risposta

0

Dai un'occhiata a mettere attributi JSON nelle tue proprietà. Ecco un esempio: Json.NET serialize object with root name. L'unica cosa che esiterei a fare è ottenere il risultato principale da una lista del genere. Non è un modello e una pratica raccomandati. aggiungi l'elenco come un'altra proprietà figlio piuttosto che derivando dall'elenco, json serialize si confonde con le tue intenzioni.

+0

Buona idea, ma ancora non funziona. Una volta taggato TestMain come JsonObject, vengono fatti mainInt e mainString, ma gli elementi dell'elenco non lo fanno! – user1961169

+0

Avere l'elenco come proprietà di TestMain sarebbe una soluzione (JSON funziona correttamente con questo), ma sfortunatamente ciò inciderà su altri codici su cui non abbiamo alcun controllo: c'è codice di terze parti che usa queste classi così come sono, derivate da una lista <>. – user1961169

0

E 'questo quello che vuoi?

[DataContract] 
public class TestItem 
{ 
    [DataMember] 
    public int itemInt { get; set; } 
    [DataMember] 
    public string itemString { get; set; } 

    public TestItem() { } 
    public TestItem(int _intVal, string _stringVal) 
    { 
     itemInt = _intVal; 
     itemString = _stringVal; 
    } 
} 

[DataContract] 
public class TestMain 
{ 
    [DataMember] 
    public int mainInt { get; set; } 
    [DataMember] 
    public string mainString { get; set; } 
    [DataMember] 
    public List<TestItem> TestItem = new List<TestItem>(); 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string test; 

     // Test classes 
     TestMain main = new TestMain(); 
     main.mainInt = 123; 
     main.mainString = "Hello"; 
     main.TestItem.Add(new TestItem(1, "First")); 
     test = Newtonsoft.Json.JsonConvert.SerializeObject(main); 
     Console.WriteLine(test); 
    } 
} 
+1

Questo risolverebbe il problema JSON, ma sfortunatamente non possiamo farlo. Il codice di terze parti esistente utilizza la classe TestMain, pertanto la classe TestMain non può essere modificata per avere l'elenco come una proprietà. TestMain deve rimanere come derivato dall'elenco . – user1961169

+0

Quindi è possibile modificare la classe TestItem? – MichaelMao

+1

No, non possiamo modificare nessuna delle classi. :( – user1961169

0

l'aggiunta di questa attrib funziona per me:

utilizzando System.ComponentModel.DataAnnotations;

[Newtonsoft.Json.JsonObject (Title = "root")] public class Testmain: Lista

+0

Grazie, [JSONObject] ha lavorato per me per ottenere una classe derivata da serializzare, ma serializzava tutto anche le cose nella classe base che non erano originariamente serializzate, quindi invece [JsonProperty] sulle proprietà che mancavano funzionava per me. – Andy

Problemi correlati