2013-09-30 13 views
5

Używam oficjalnego sterownika Mongo C# i RestSharp, aby wywołać Rest Api z Json.NET w celu przeprowadzenia operacji szeregowania/deserializacji. Że mam klasy osoba w następujący sposób, który chciałbym POST & otrzymujemy:Proces deserializacji w systemie Json.NET Mongo ObjectId daje zły wynik.

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

utworzyć nowy obiekt osobę:

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

Post it, a na serwerze widzę po której jest poprawna:

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

problemem jest to, kiedy wykonać uzyskać ObjectId uzyskać na kliencie jest {...} 0000000000000 czyli nie {5249} ja ..... expe ct. Surowa odpowiedź pokazuje poprawną wartość, ale po deserializacji tracę ją.

Kod ObjectIdConverter jest:

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)); 
    } 
} 

Każda pomoc będzie mile widziane.

Odpowiedz

4

Niepoprawnie implementujesz metodę konwertera ReadJson. Parametr existingValue nie daje wartości przekształconej z postaci szeregowej odczytanej z JSON, ale dodaje istniejącą wartość obiektu do obiektu, który zostanie zamieniony na. W większości przypadków będzie to wartość pusta lub zerowa. Należy użyć wartości reader, aby uzyskać wartość z JSON, przekonwertować ją w razie potrzeby, a następnie zwrócić skonwertowaną wartość.

Zakładając swoją klasę ObjectId ma konstruktora, który akceptuje ciąg szesnastkowy, oto jak można zaimplementować metodę ReadJson:

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

Ahhhh sens !!! Dzięki Brian, dobra odpowiedź! –

Powiązane problemy