2013-09-30 2 views
5

Я использую официальный драйвер Mongo C# и RestSharp для вызова Rest Api с Json.NET для выполнения сериализации/десериализации. Скажем, у меня есть класс Person следующим образом, который я хотел бы POST & GET:Json.NET deserializing Mongo ObjectId дает неверный результат

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

POST это, и на сервере я вижу после чего правильно:

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

проблема, когда я выполнить пОЛУЧИТЕ ObjectId я получаю на клиенте {0000000000000 ...} т.е. не {5249} ..... Я бы EXPE кт. Сырой ответ показывает правильное значение, но как только я десериализую, я его потеряю.

Код 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

Вы неправильно используете метод ReadJson конвертера. Параметр existingValue не дает вам десериализованное значение, считываемое из JSON, оно дает вам существующее значение объект, который вы будете заменять. В большинстве случаев это будет пустой или пустой. Что вам нужно сделать, это использовать 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>()); 
} 
+0

Ahhhh имеет смысл !!! Спасибо Брайан, хороший ответ! –

Смежные вопросы