2012-10-13 58 views
2

我想通過ApiController返回下面的示例類,它可能只是JSON.NET序列化的,但我想避免只將整個類轉換爲json-string 。用BsonDocument通過JSON.NET或XML序列化器序列化類

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

    public string name { get; set; } 

    public BsonDocument layout { get; set; } 
} 

現在我已經看了幾個方法,但只有一個工作,到目前爲止,這是創造一個第二類和佈局屬性轉換爲JSON字符串這樣的手動兩之間進行映射:

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#和可能很容易錯過明顯的答案。

回答

3

如果我正確理解你的問題,你只是想要得到佈局,因爲JSON是正確的?我不是100%,我可以看到你想要達到什麼輸出,但如果是這樣,你的第二個代碼示例已經非常接近了,試試這個;

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(); } 
    } 
} 
+0

正確,我試圖讓整個對象爲json,但是JSON.NET並沒有序列化BsonDocument並且給我一個錯誤。你的解決方案有效謝謝! –

2

我發現我能夠直接從Api控制器返回BSON文件作爲IDictionaries返回它們。你應該可以通過將佈局屬性聲明爲IDictionary來做類似的事情。這個技巧可以讓你真正輕鬆地從MongoDB獲取數據,因爲還有一個BsonDocument構造函數,它需要一個IDictionary。

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(); 
      } 
     }   
    } 
+0

你的代碼只檢索一個列表或一個數組,但不是一個非結構化的對象,對吧?或者有沒有辦法讓字典處理未知和非結構化的對象? –

+0

它按照原樣處理任意的BsonDocument。我從工作代碼粘貼這個,我的文檔有多層嵌套,包括數組子元素。 BsonDocument.ToDictionary()對字典層次結構執行深層轉換,JSON.Net序列化程序正確地爲此字典層次結構發出JSON。 –

+0

看來我得到它在模型中使用類型IDictionary 並通過.ToDictionary()返回佈局對象()非常感謝! –