2012-03-15 14 views
5

Ho iniziato a utilizzare json.net per produrre DateTimes migliori, ma ho notato che una delle mie proprietà non viene serializzata. Non ha setter e il suo getter dipende da un altro membro dell'oggetto, ad es.Proprietà getter di Json.net non serializzata

public int AmountInPence { get; set;} 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 

Ho fatto una classe che eredita da JsonResult e la linea principale è:

string serializedObject = JsonConvert.SerializeObject(Data, new IsoDateTimeConverter()); 

Qualcuno può dirmi come costringerlo a serializzare che la proprietà?

Modifica: Giusto per chiarire: era un esempio semplificato. L'ho aggiornato per riflettere che sto trasmettendo l'int al decimale prima. Avevo dimenticato di controllare in precedenza, ma la proprietà fa parte di una classe parziale, perché viene restituita da un servizio WCF. Sto dichiarando quella proprietà nella mia assemblea, quindi questo potrebbe essere un indizio?

risposta

15

Non c'è niente di sbagliato con il JSON. netto. Può serializzare solo le proprietà di sola lettura. Il problema è nella tua AmountInPounds

public decimal AmountInPounds { get { return AmountInPence/100; } } 

Perché il vostro stanno facendo divisione intera con / 100 significa che si otterrà se 0AmountInPence è inferiore a 100.

Quello che vi serve è quello di utilizzare il m suffix per segnare 100 come decimal:

public decimal AmountInPounds { get { return AmountInPence/100m; } } 

per ottenere il giusto risultato in AmountInPounds.

EDIT dopo i commenti:

La proprietà calcolata AmountInPounds era in una classe parziale di un servizio WCF generato DataContract.

E in DataContract se una proprietà non è contrassegnata con DataMemberAttribute sembra non verrà serializzata.

Così accanto risposta del PO:

[JsonPropertyAttribute(DefaultValueHandling = DefaultValueHandling.Include)] 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 

Questo è anche funziona:

[System.Runtime.Serialization.DataMemberAttribute()] 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 
+0

Grazie per la risposta. Non penso che sia per quello però (ho modificato la mia domanda) – NickL

+0

Ok, allora dovresti fornire più contesto. Che cosa significa 'Data' cosa stai tentando di serializzare? Qual è l'output? Perché anche @StriplingWarrior ha sottolineato: JsonConvert serializza 'AmountInPounds' ... – nemesv

+0

I dati sono un oggetto - una proprietà di JsonResult. Dovrebbe essere lanciato per primo? – NickL

2

Questo dovrebbe funzionare per voi. Il seguente programma in LINQPad funziona bene:

void Main() 
{ 
    JsonConvert.SerializeObject(new A(), new IsoDateTimeConverter()).Dump(); 
} 

public class A 
{ 
    public int AmountInPence { get; set;} 
    public decimal AmountInPounds { get { return AmountInPence/100; } } 
} 

uscita:

{ "AmountInPence": 0, "AmountInPounds": 0.0}

1

OK sembra che ho trovato la risposta, mi dispiace per non aver fornito maggiori dettagli nel post, ma Non penso che alla fine abbia avuto importanza.

avevo bisogno di aggiungere un attributo sulla proprietà AmountInPounds:

[JsonPropertyAttribute(DefaultValueHandling = DefaultValueHandling.Include)] 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 
+0

Sono felice che tu abbia trovato una soluzione, ma è ancora molto strano. Perché non ero in grado di riprodurre il problema non con classi parziali o ereditarietà o con proprietà nullable. 'Newtonsoft.Json versione 4.0.8' includeva sempre le proprietà readonly ... – nemesv

+0

Sì, ho creato una soluzione separata replicando tutto tranne la classe creata dal servizio WCF e ha funzionato come previsto. Forse c'è un attributo su quella classe che impedisce a Json.Net di serializzare automaticamente quelle proprietà readonly. Grazie per il tuo tempo! – NickL

+0

Sembra che il 'DataMemberAttribute' risolva anche il tuo problema, non so perché forse questo è un bug in Json.net. Comunque ho anche aggiornato la mia risposta con queste informazioni. – nemesv

Problemi correlati