使用JSON序列化程序反序列化MongoDB对象ID

6
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 reader仍然出现相同的错误,有任何想法吗?

最后从SO尝试了这个方法。

JsonReader异常

解析值时遇到意外字符: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字符串。 - Brian Rogers
嗨,它来自数据库,看起来像这样 { "_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. " } - fuzzybear
2个回答

7
您看到此错误是因为_id属性的值不符合JSON标准(请参见JSON.org)。JSON值必须是以下之一:
  • 字符串(以引号标记"开头和结尾)
  • 数字
  • 对象(以大括号{}开头和结尾)
  • 数组(以方括号[]开头和结尾)
  • 关键字truefalsenull
ObjectId("5378f94a3513fa3374be7e20")的值似乎是一个函数,这是无效的。 ISODate("2014-05-18T18:17:46.983Z")的值也有同样的问题。如果您想使用JSON.net解析它,则需要以某种方式更改JSON以满足标准。

+1 技术上是正确的,这是 DB(BSON)格式,奇怪的是 BSON 可以转换为 JSON,var docToJson = doc.ToJson<BsonDocument>(); 只是无法使用 JSON.NET 进行反序列化,感谢您的帮助,一定有办法,这里有几个指针,但我都试不出来。 - fuzzybear
1
如果您正在使用BSON开始,请为什么不直接从中反序列化,而不是先尝试将其转换为JSON?也许是 doc.ToJson 导致了问题。在Json.Net文档中有一个示例展示了如何反序列化BSON。请参考:http://james.newtonking.com/json/help/?topic=html/DeserializeFromBson.htm - Brian Rogers
哇,没想到它存在,太棒了,谢谢Brian,你帮我省了些麻烦!!! - fuzzybear

0
问题在于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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接