如何检索mongodb对象并将其作为json对象返回

时间:2011-05-31 01:49:27

标签: c# jquery asp.net asp.net-mvc-3 mongodb

嗨,我有这个作为我的控制员之一:

[HttpPost]
        public JsonResult GetPinPoints(string Id)
    {
        Frames rslt = null;

        string connString = ConfigurationManager.ConnectionStrings["MongoConnStringNew"].ToString();
        MongoUrl murl = new MongoUrl(connString);
        MongoServer mgconf = new MongoServer(murl);
        try
        {
            mgconf.Connect();
            MongoDatabase frmlydb = mgconf.GetDatabase("framely");
            MongoCollection<Frames> collection = frmlydb.GetCollection<Frames>("Frames");
            ObjectId oid = new ObjectId(Id);
            Frames frms = collection.FindOne(Query.EQ("_id", oid));

            if (frms != null)
            {
                rslt = frms;
            }
        }
        catch (Exception ex)
        {
        }
        finally
        {
            mgconf.Disconnect();
        }

        return Json(rslt.CoordinatesObj.ToJson());
    }

mongo对象如下所示:

{"MetaTagsObj":{"Meta1":"my fam","Meta2":"lololo","Meta3":"lulz"},"PictureID":"http://framely.s3.amazonaws.com/0b7a9a72-c61b-4dec-a814-40b003072e31.jpg","UserID":"1","CoordinatesObj":[{"Position":1,"Top":182,"Left":20,"Height":73,"Width":90},{"Position":2,"Top":69,"Left":103,"Height":98,"Width":1...

我使用ajax jquery函数来调用如下所示的控制器:

$("#mybutton").click(function(){
           $.ajax({
                url: '/Member/GetPinPoints',
                type: "POST",
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                success: function(data) {
            alert(data);
            },
            error: function() {

            alert("error");
            }
            });


    return false;
});

我不认为我这样做是正确的,我认为这与我返回json对象的方式有关。我一直收到这个错误:

{“对象引用未设置为对象的实例。”}

我正在返回Json对象的地方。

2 个答案:

答案 0 :(得分:0)

return Json(myObject)语句应该将一个被序列化为JSON的对象作为字符串返回给浏​​览器,但是通过调用ToJson()rslt.CoordinatesObj对象将被序列化两次。

也有可能CoordinatesObj没有被正确去除,因此它会抛出异常,因为在空对象上调用了ToJson()Frames类应该类似于处理CoordinatesObj数组的反序列化:

public class Frames
{
    IEnumerable<Coordinate> CoordinatesObj { get; set; }

    public class Coordinate
    {
        int Position { get; set; }
        int Top { get; set; }
        int Left { get; set; }
        int Height { get; set; }
        int Width { get; set; }
    }
}

答案 1 :(得分:0)

如果FindOne找不到匹配的文档,则返回null,因此在代码示例中,“rslt”变量完全可以为null。

此外:

  1. 无需呼叫Connect,驱动程序自动连接
  2. 不要'断开连接,它会干扰 连接池