【问题标题】:Automatically retun mongodb ObjectId as string with Json.NET in MVC在 MVC 中使用 Json.NET 自动将 mongodb ObjectId 作为字符串重新调整
【发布时间】:2014-12-05 20:46:08
【问题描述】:
我有一个 MVC .net 项目,我正在使用 mongodb。
在我的一些控制器中,我返回带有 ObjectId 的 JsonResult。我希望将 ObjectId 序列化为字符串。
我发现了一个类似的问题并使用了这个答案,使用了自定义 JsonConverter :
JSON.NET cast error when serializing Mongo ObjectId
但是,当我尝试返回 JsonResult(使用 return Json(myObject))时,根本不会调用 JsonConverter。
当我使用 return JsonConvert.SerializeObject(myObject); 返回一个字符串时,JsonConverter 到达并成功。
我错过了什么?
谢谢!
【问题讨论】:
标签:
c#
asp.net-mvc
mongodb
json.net
【解决方案1】:
想出了一个解决方案,希望对某人有所帮助。
基本上在控制器中,我没有返回 MVC 的 JsonResult,而是返回了 Newtonsoft 的 JObject。
我的班级是这样的:
using MongoDB.Bson;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class StubClass
{
[JsonConverter(typeof(ObjectIdConverter))]
public ObjectId Id { get; set; }
}
JsonConverter 类如下所示:
using MongoDB.Bson;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class ObjectIdConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value.ToString());
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
return new ObjectId(token.ToObject<string>());
}
public override bool CanConvert(Type objectType)
{
return typeof(ObjectId).IsAssignableFrom(objectType);
//return true;
}
}
还有控制器:
using MongoDB.Bson;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
[HttpGet]
public JObject Index()
{
StubClass c = new StubClass()
{
Id = ObjectId.GenerateNewId()
};
JObject jobj = JObject.FromObject(c);
return jobj;
}