5

公式の Mongo C# ドライバーと RestSharp を使用して、Json.NET で Rest Api を呼び出し、シリアライゼーション/デシリアライゼーションを実行しています。POST & GET したい次のような 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));
   }
}

どんな助けでも大歓迎です。

4

1 に答える 1

5

ReadJsonコンバーターのメソッドを正しく実装していません。このexistingValueパラメーターは、JSON から読み取った逆シリアル化された値を提供するのではなく、置き換えるオブジェクトの既存の値を提供します。ほとんどの場合、これは null または空になります。必要なことは、 を使用しreaderて JSON から値を取得し、必要に応じて変換してから、変換された値を返すことです。

ObjectIdクラスに16進文字列を受け入れるコンストラクタがあると仮定すると、メソッドを実装するReadJson方法は次のとおりです。

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    JToken token = JToken.Load(reader);
    return new ObjectId(token.ToObject<string>());
}
于 2013-09-30T17:53:02.507 に答える