2013-09-30 2 views
5

공식 Mongo C# Driver 및 RestSharp를 사용하여 Json.NET의 Rest API를 호출하여 직렬/직렬화를 수행합니다. Mongo ObjectId를 비 직렬화하는 Json.NET이 잘못된 결과를 제공합니다.

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를하고, 서버에서 내가 볼 나는 & GET을 POST하고 싶은, 다음과 같이 나는 Person 클래스가 있다고 가정 해 올바른 다음 : 나는 내가 클라이언트에서 얻을 ObjectId가이 GET 수행 할 때

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

문제는 즉이 아니라 {5249 .....} 내가 좋겠 {0000000000000 ...}이다 expe ct. 미가공 응답은 올바른 값을 나타내고 있지만 일단 역 직렬화하면 느슨하게됩니다.

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에서 읽은 비 직렬화 된 값을 제공하지 않으므로 의 기존 값을 대체 할 개체를 제공합니다. 대부분의 경우 이것은 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>()); 
} 
+0

아아는 의미가 있습니다! 감사 브라이언, 좋은 대답! –

관련 문제