簡體   English   中英

Json.NET反序列化Mongo ObjectId給出錯誤的結果

[英]Json.NET deserializing Mongo ObjectId is giving the wrong result

我使用的是官方的Mongo C#驅動程序,以及RestSharp用Json.NET調用Rest Api來執行序列化/反序列化。 假設我有一個Person類,如下所示,我想發布並獲取:

public class Person
{
  [JsonProperty("_id"),JsonConverter(typeof(ObjectIdConverter))]
  public ObjectId Id {get;set;}
  public string Name {get;set;}
}

我創建一個新的Person對象:

var person = new Person{Id = ObjectId.GenerateId(),Name='Joe Bloggs'};

開機自檢,在服務器上,我看到以下正確信息:

{ _id: 52498b56904ee108c99fbe88, name: 'Joe Bloggs'}

問題是,當我執行GET時,我在客戶端獲得的ObjectId是{0000000000000 ...},而不是我期望的{5249 .....}。 原始響應顯示正確的值,但是一旦我反序列化,我就會失去它。

ObjectIdConverter代碼為:

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)
   {
     var objectId = (ObjectId)existingValue; // at this point existingValue is {000...}
     return objectId;
   }

   public override bool CanConvert(Type objectType)
   {
     return (objectType == typeof (ObjectId));
   }
}

任何幫助,將不勝感激。

您正在錯誤地實現轉換器的ReadJson方法。 existingValue參數不會為您提供從JSON讀取的反序列化值,而是為您將要替換的對象的現有值。 在大多數情況下,該值為null或為空。 您需要做的是使用reader從JSON獲取值,根據需要對其進行轉換,然后返回轉換后的值。

假設您的ObjectId類具有一個接受十六進制字符串的構造函數,這是實現ReadJson方法的方式:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    JToken token = JToken.Load(reader);
    return new ObjectId(token.ToObject<string>());
}

暫無
暫無

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

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