2017-02-23 7 views
3

私はJSON入力文字列から作成されたモデルを持っています。しかし、PortfolioHoldingというクラスの1つに、最終結果で返すフィールドがありません。私の現在の解決策は、既存のModelクラスにそのフィールドを追加することです。しかし、私がデバッグすると、JSONの入力文字列が正しくないbcに失敗します。デシリアライズ時に無視したいフィールドに[JsonIgnore]を追加しようとしましたが、それでもどちらも助けにはなりませんでした。元のクラスを変更せずに自分のクラスにプロパティを追加する方法

私のクラスにプロパティを動的に追加し、自分の入力がJSON入力ファイルに基づいて正しくなるようにするにはどうすればよいですか?

public class PortfolioHolding 
    { 
     public string fundIdentifier { get; set; } 
     public int fundRating { get; set; } 
     public double fundExpenseRatio { get; set; } 
     public double fundWeight { get; set; } 
     [JsonIgnore] 
     public double fundAlpha { get; set; } //MODIFIED by adding fundAlpha attribute 
    } 

実際のモデルにはfundAlphaが含まれておらず、テスト中にテストが成功しました。

+0

ニースの質問を。同じことを思い出す。 –

+0

フィールドを追加してこのクラスをJSONにシリアル化しますか? –

+0

はい、直列化@Romaの際にfundAlpha属性を追加する必要があります。 –

答えて

1

あなたはPortfolioHoldingから匿名型を作成し、それをシリアル化することができます

PortfolioHolding ph = new PortfolioHolding(); 
// fill ph 

var anonymous = new 
{ 
    fundIdentifier = ph.fundIdentifier, 
    fundRating = ph.fundRating, 
    fundExpenseRatio = ph.fundExpenseRatio, 
    fundWeight = ph.fundWeight, 
    fundAlpha = neededValue // here your value from ph or any other 
}; 

var json = JsonConvert.SerializeObject(anonymous); 

// deserialize 

var deserializedAnonymous = JsonConvert.DeserializeAnonymousType(json, anonymous); 

ph.fundExpenseRatio = deserializedAnonymous.fundExpenseRatio; 
//other properties 
+0

ありがとうございました!匿名のタイプを追加する最も良い方法はどこですか?この問題のコードは次のとおりです。http:// stackoverflow。com/questions/42395116/c-sharp-return-multiple-values-in-objectを参照してください。 –

+1

@MihirPatel、匿名型はシリアライズ/デシリアライズにのみ必要です。これを行う前に作成する必要があります。 –

+0

ありがとうございます!これは動作します! –

2

前回の解決方法は申し訳ありません。

私が理解していることは、同じモデルクラスを使用してJSONからの入力を取得し、そのモデルをプロジェクトの一部の外に戻すことです。

可能な解決策は2つあります。

1)同じライブラリまたは名前空間内のデータベース(ファイルでもよい)からデータ(JSON)を読み取っている場合、internalキーワードを使用できます。同じ名前空間内では、そのプロパティにアクセスすることができ、そうでない名前空間からアクセスすることができます。

2)使用ExpandoObject

resultSet.Select(a => new { a.col1, a.col2, a.col3, /*and skip the one which you don't want to be selected*/}) 
+0

AnotherPropertyとは何ですか?フォローしていない。 –

+0

ファーストクラスのPortfolioHoldingでエラーが発生しました:宣言型の部分修飾子がありません... –

0

のように、結果セットからの匿名のオブジェクトを選択することができます。

は、そのメンバーは、実行時に動的に追加および削除できるオブジェクトを表します。

dynamic expando = new ExpandoObject(); 
expando.Prop1= 1; 
expando.Prop2 = "Test"; 

使用リストデシリアライズ:

var exConverter = new ExpandoObjectConverter(); 
dynamic obj = JsonConvert.DeserializeObject<List<ExpandoObject>>(json, exConverter); 
+0

ライブラリを使用しないように最善を尽くしていますが、このソリューションを試してみます。 –

関連する問題