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

标签 c# json mongodb serialization json.net

我正在使用官方 Mongo C# 驱动程序和 RestSharp 使用 Json.NET 调用 Rest Api 来执行我的序列化/反序列化。假设我有一个 Person 类,如下所示,我想 POST & GET:

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...} 即不是我期望的 {5249 .....}。原始响应显示正确的值,但是一旦我反序列化,我就会丢失它。

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

任何帮助将不胜感激。

最佳答案

您正在错误地实现转换器的 ReadJson 方法。 existingValue 参数不会为您提供从 JSON 读取的反序列化值,它会为您提供 您将要替换的对象的现有值。在大多数情况下,这将为 null 或空。您需要做的是使用 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>());
}

关于c# - Json.NET 反序列化 Mongo ObjectId 给出了错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19097872/

相关文章:

c# - 我现在应该为此目的使用抽象基类吗?

c# - C#Nest&Elasticsearch 6.x:如何过滤/计数嵌套字段(在内部List <object>中)

javascript - 如何将 JSON 数据从 python 返回到 javascript?

jquery - 为什么我必须先 JSON.stringify,然后才能 .parseJSON Google+ API 的结果集?

json - 将 Json 字符串解析为 Kotlin 对象会抛出 InvalidDefinitionException 和 Jackson

mongodb - 如何在 mongodb 的 BinData 字段上通过部分二进制查找?

c# - 如何将适用于整数的通用表达式树代码应用于枚举(例如,如何使 Expression.PostIncrementAssign() 适用于枚举?)?

c# - 通过名字获取控制权,包括 child

java - mongodb中查询过滤数据

node.js - 如何在 NodeJS 和 Mongoose 中填充需要引用用户名的帖子