Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Json.NET反序列化Mongo ObjectId给出了错误的结果_C#_Json_Mongodb_Serialization_Json.net - Fatal编程技术网

C# Json.NET反序列化Mongo ObjectId给出了错误的结果

C# Json.NET反序列化Mongo ObjectId给出了错误的结果,c#,json,mongodb,serialization,json.net,C#,Json,Mongodb,Serialization,Json.net,我使用官方的Mongo C#驱动程序和RestSharp调用Json.NET的Rest Api来执行序列化/反序列化。假设我有一个Person类,如下所示,我想发布并获取: public class Person { [JsonProperty("_id"),JsonConverter(typeof(ObjectIdConverter))] public ObjectId Id {get;set;} public string Name {get;set;} } 我创建一个新的Pe

我使用官方的Mongo C#驱动程序和RestSharp调用Json.NET的Rest Api来执行序列化/反序列化。假设我有一个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…} i、 不是我所期望的那种。原始响应显示了正确的值,但一旦我反序列化,我就失去了它

ObjectdConverter代码为:

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

任何帮助都将不胜感激。

您错误地实现了转换器的
ReadJson
方法。
existingValue
参数不提供从JSON读取的反序列化值,而是提供要替换的对象的现有值。在大多数情况下,这将是null或空的。您需要做的是使用
读取器
从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>());
}
public override object ReadJson(JsonReader reader,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
JToken令牌=JToken.Load(读卡器);
返回新的ObjectId(token.ToObject());
}