2013-09-30 37 views
5

Tôi đang sử dụng trình điều khiển chính thức của Mongo C# và RestSharp để gọi Rest Api với Json.NET để thực hiện tuần tự hóa/deserialization của tôi. Nói rằng tôi có một lớp người như sau, mà tôi muốn đăng & GET:Json.NET deserializing Mongo ObjectId đang đưa ra kết quả sai

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

tôi tạo ra một đối tượng Person mới:

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

POST nó, và trên máy chủ tôi thấy sau đó là chính xác:

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

vấn đề, là khi tôi thực hiện một lấy ObjectId tôi nhận được trên máy khách là {0000000000000 ...} tức là không phải là {5249 .....} tôi muốn expe ct. Phản hồi thô cho thấy giá trị chính xác, nhưng một khi tôi deserialize tôi mất nó.

Mã ObjectIdConverter là:

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

Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

4

Bạn đang triển khai phương thức ReadJson của trình chuyển đổi không chính xác. Tham số existingValue không cung cấp cho bạn giá trị được deserialized đọc từ JSON, nó cung cấp cho bạn giá trị hiện tại của đối tượng mà bạn sẽ thay thế. Trong hầu hết các trường hợp, giá trị này sẽ là rỗng hoặc trống. Những gì bạn cần làm là sử dụng reader để lấy giá trị từ JSON, chuyển đổi nó khi cần, sau đó trả về giá trị được chuyển đổi.

Giả sử lớp ObjectId của bạn có một constructor mà chấp nhận một chuỗi hex, đây là cách bạn sẽ thực hiện các phương pháp 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 có ý nghĩa !!! Cảm ơn Brian, câu trả lời hay! –

Các vấn đề liên quan