3

我想通过 ApiController 返回以下示例类,它可能只是 JSON.NET 序列化,但我想避免只是将整个类转换为 json 字符串。

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

    public string name { get; set; }

    public BsonDocument layout { get; set; }
}

现在我已经研究了几种方法,但到目前为止只有一种方法有效,即创建第二个类并通过将 layout-property 转换为 json-string 在两者之间手动映射,如下所示:

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% 我可以看到你想要实现的输出,但如果是这样,你的第二个代码示例已经非常接近,试试这个;

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 控制器返回它们。您应该能够通过将布局属性声明为 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();
            }
        }        
    }
于 2012-10-18T19:48:32.073 回答