使用JSON序列化器反序列化mongodb对象Id

本文关键字:mongodb 对象 Id 反序列化 JSON 序列化 使用 | 更新日期: 2023-09-27 18:03:51

var docToJson = doc.ToJson<BsonDocument>();
story Featured = JsonConvert.DeserializeObject<story>(docToJson);

public class story 
{
[JsonProperty("_id"), JsonConverter(typeof(ObjectIdConverter))]
public ObjectId Id { get; set; }
....
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 (objectType == typeof(ObjectId));
        }
      }
    }

我卡住了,我已经尝试了六种方法,我仍然得到同样的错误与json阅读器,有人有什么想法吗?

最后一次尝试from SO*

JsonReader异常

解析value: o时遇到意外字符。路径'_id',第1行,位置10.

JSON字符串看起来像这样:

{
    "_id": ObjectId("5378f94a3513fa3374be7e20"),
    "cc": "GB",
    "userName": "xyz ",
    "userImage": "img/16.jpg",
    "createdDate": ISODate("2014-05-18T18:17:46.983Z"),
    "Headling": "Veniam, amet, incidunt veniam, ipsam nostrud natus exercitationem consectetur, eos dolorem. ",
    "subheading": "Veniam, amet, incidunt veniam, ipsam nostrud. "
}

使用JSON序列化器反序列化mongodb对象Id

您得到这个错误是因为_id属性的值不符合JSON标准(参见JSON.org)。JSON值必须是下列值之一:

  • 字符串(以引号"开头和结尾)
  • 对象(以花括号{}开头和结尾)
  • 一个数组(以方括号[]开始和结束)
  • 关键字truefalsenull

ObjectId("5378f94a3513fa3374be7e20")似乎是一个函数,这是无效的。值ISODate("2014-05-18T18:17:46.983Z")也有同样的问题。如果您想使用JSON.net解析JSON,则需要以某种方式更改JSON以满足标准。

问题是MongoDB Bson序列化输出不将对象转换为Json.Net所期望的普通Json。幸运的是,可以将BsonDocument转换为。net对象,然后将该对象序列化为Json。

object dotnetObject = BsonTypeMapper.MapToDotNetValue(bsonDocument);
// Json mapped to default .Net objects
string json = Newtonsoft.Json.JsonConvert.SerializeObject(dotnetObject);
// Parsing as JObject
var jobject = JObject.Parse(json);
// Deserializing as your custom Type
var myObject = JsonConvert.DeserializeObject<MyType>(json);