2012-10-13 37 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()返回布局对象()非常感谢! –