簡體   English   中英

使用 JSON 序列化程序反序列化 Mongo DB 對象 ID

[英]Mongo DB object Id deserializing using JSON serializer

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。路徑“_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. "
}

您收到此錯誤是因為_id屬性的值不符合 JSON 標准(請參閱JSON.org )。 JSON 值必須是以下值之一:

  • 一個字符串(以引號"開頭和結尾)
  • 一個號碼
  • 一個對象(以花括號{}開頭和結尾)
  • 一個數組(以方括號[]開頭和結尾)
  • 關鍵字truefalsenull

ObjectId("5378f94a3513fa3374be7e20")似乎是一個無效的函數。 ISODate("2014-05-18T18:17:46.983Z")也有同樣的問題。 如果您想使用 JSON.net 解析它,您將需要以某種方式更改您的 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM