使用JSON序列化程序的Mongodb objectId反序列化

时间:2014-05-18 21:17:09

标签: c# mongodb azure json.net deserialization

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读者有同样的错误,任何想法都有吗?

最后一次尝试来自SO *

  

JsonReader异常

     

解析值时遇到意外的字符:O。路径&#39; _id&#39;,第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. "
}

2 个答案:

答案 0 :(得分:6)

您收到此错误,因为_id属性的值不符合JSON标准(请参阅JSON.org)。 JSON值必须是以下之一:

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

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

答案 1 :(得分: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);