3

おそらくJSON.NETでシリアル化されたApiControllerで次のサンプルクラスを返したいのですが、クラス全体をjson文字列に変換するだけは避けたいです。

public class Report
{
    [BsonId, JsonIgnore]
    public ObjectId _id { get; set; }

    public string name { get; set; }

    public BsonDocument layout { get; set; }
}

今私はいくつかの方法を見てきましたが、これまでにうまくいったのは1つだけです.2番目のクラスを作成し、次のようにレイアウトプロパティをjson文字列に変換することで2つの間に手動でマップします:

layout.ToJson();

これはあまりエレガントではないようで、もっと良い方法があるかどうか疑問に思っています。次のアイデアはどれも、さまざまな理由で機能しません。

public class Report
{
    [BsonId, JsonIgnore]
    public ObjectId _id { get; set; }

    public string name { get; set; }

    [JsonIgnore]
    public BsonDocument layout { get; set; }

    [JsonProperty(PropertyName = "layout")]
    public string layout2JSON()
    { 
        return layout.ToJson();
    }
}

または:

public class Report
{
    [BsonId, JsonIgnore]
    public ObjectId _id { get; set; }

    public string name { get; set; }

    public BsonDocument layout 
    { 
        get 
        {
            return layout.ToJson();
        }
        set; 
    }
}

私は C# にかなり慣れていないので、明らかな答えを簡単に見逃す可能性があります。

4

2 に答える 2

4

私があなたの質問を正しく理解していれば、JSON として正しいレイアウトを取得しようとしているだけですか? 私は 100% ではありません。達成しようとしている出力はわかりますが、そうであれば、2 番目のコード サンプルはすでに非常に近いものでした。これを試してください。

public class Report
{ 
     [BsonId, JsonIgnore]
     public ObjectId _id { get; set; }

     public string name { get; set; }

     [JsonIgnore]
     private BsonDocument layout { get; set; }

     [BsonIgnore]
     [JsonProperty(PropertyName = "layout")]
     public string layout2JSON
     { 
         get { return layout.ToJson(); }
     }
}
于 2012-10-13T23:21:05.950 に答える
2

BSON ドキュメントを IDictionaries として返すことで、Api コントローラーから直接 BSON ドキュメントを返すことができることがわかりました。レイアウト プロパティを IDictionary として宣言することで、同様のことができるはずです。IDictionary を受け取る BsonDocument コンストラクターも存在するため、このトリックを使用すると、MongoDB との間でデータを簡単に取得できます。

    public IEnumerable<IDictionary> Get()
    {
        using (var mongo = new Mongo())
        {
            var collection = mongo.GetCollection<BsonDocument>("Report");

            var cursor = collection.FindAll();
            cursor.SetFields(_summaryFields); 
            int i = 0;
            foreach (var doc in cursor)
            {
                i++;
                yield return doc.ToDictionary();
            }
        }        
    }
于 2012-10-18T19:48:32.073 に答える