2012-03-15 7 views
5

json.netを使用してDateTimesを作成し始めましたが、自分のプロパティの1つがシリアル化されていないことに気付きました。それはセッターを持たず、そのゲッターはオブジェクトの別のメンバーに依存します。Json.net getterプロパティがシリアル化されていません

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

私はJsonResultから継承するクラスを作ったし、メインラインは次のとおりです。

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

誰もがそのプロパティをシリアル化するためにそれを強制する方法を教えてもらえますか?

編集: これは簡単な例です。簡略化した例です。私はintを10進数に最初にキャストしていることを反映するように更新しました。私はこれまでチェックしていたことを忘れていましたが、プロパティはWCFサービスから返されているため、部分クラスの一部です。私は私の議会でその財産を宣言しているので、これは手掛かりになるでしょうか?

答えて

15

JSONは何も問題はありません。ネット。読み取り専用のプロパティをうまくシリアライズできます。あなたは/ 100で整数除算を行っている、それはAmountInPenceはあなたが必要なもの未満100

ある場合は0を取得することを意味しているので 問題は、あなたのAmountInPounds

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

である100をマークするm suffixを使用することですdecimalとして:

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

AmountInPoundsで正しい結果を得るために。コメントの後に

EDIT:

計算プロパティAmountInPounds WCFサービスのの部分クラスでDataContractを生成しました。

のプロパティが表示されていない場合は、DataContractにはシリアル化されていないようです。

だから、OPの答えの横に:

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

これもある作品:

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

感謝を。私はそれのためだとは思わない(自分の質問を編集した) – NickL

+0

[OK]をクリックすると、より多くのコンテキストを提供する必要があります。あなたは何をシリアル化しようとしている 'データ'とは何ですか?出力は何ですか? @StriplingWarriorも指摘しているので、JsonConvertは 'AmountInPounds'をシリアル化します。 – nemesv

+0

データはオブジェクトです.JsonResultのプロパティです。最初にキャストする必要がありますか? – NickL

2

これはうまくいくはずです。 LINQPadで次のプログラムが正常に動作します:

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

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

出力:

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

1

OK、私は答えを見つけたように、ポストに詳細を提供していないため申し訳ありません見えますが、私はそれが最終的に重要だとは思わない。

私はAmountInPoundsプロパティに属性を追加するために必要な:返信用

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

私はあなたが解決策を見つけたことをうれしく思っていますが、それはまだ非常に奇妙です。部分的なクラスや継承ではなく、null可能なプロパティで問題を再現できなかったためです。 'Newtonsoft.Json version 4.0.8'には常にreadonlyプロパティが含まれています... – nemesv

+0

はい、私は、WCFサービスによって作成されるクラスとは別にすべてを複製する別個のソリューションを作成しました。おそらく、そのクラスには、Json.Netがこれらの読み取り専用プロパティを自動的にシリアル化するのを防ぐ属性があります。御時間ありがとうございます! – NickL

+0

'DataMemberAttribute'もあなたの問題を解決するようですが、なぜこれがJson.netのバグなのかわかりません。しかし私はこの情報で私の答えを更新しました。 – nemesv

関連する問題