从邮递员发布Mongo ObjectId

时间:2019-04-24 20:57:34

标签: c# json mongodb json.net mongodb-.net-driver

我在C#中使用MongoDb.Driver,并且具有这样的模型:

public class MyClass
{
    [BsonId]
    public ObjectId Id { get; set; }

    public ObjectId UserId { get; set; }
}

UserId是另一个集合中的ObjectId类型。

在邮递员中,我试图发布带有正文的请求:

{
    "userId": "5cc082d130b097e86665309d"
}

但是我得到了:

{
    "userId": [
        "Error converting value \"5cc082d130b097e86665309d\" to type 'MongoDB.Bson.ObjectId'. Path 'userId', line 2, position 39."
    ]
}

如何发布ObjectId,或者该类型的属性上需要一些属性?

谢谢

1 个答案:

答案 0 :(得分:2)

您将收到此异常,因为 Newtonsoft.Json 无法将您发送的字符串转换为MongoDB的ObjectId。要解决此问题,您可以实现自己的JsonConverter并使用ObjectId.Parse()运行转换:

public class StringToObjectId : JsonConverter
{
    public override bool CanConvert(Type objectType) => objectType == typeof(ObjectId);

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        return ObjectId.Parse(token.ToObject<string>());
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value.ToString());
    }
}

然后,您可以使用JsonConverter属性装饰属性:

public class MyClass
{
    [BsonId]
    public ObjectId Id { get; set; }

    [JsonConverter(typeof(StringToObjectId))]
    public ObjectId UserId { get; set; }
}