Публикация Mongo ObjectId от Почтальона - PullRequest
1 голос
/ 24 апреля 2019

Я использую MongoDb.Driver в C #, и у меня есть такая модель:

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

    public ObjectId UserId { get; set; }
}

UserId имеет тип ObjectId из другой коллекции.

В почтальонеЯ пытаюсь POST запрос с телом:

{
    "userId": "5cc082d130b097e86665309d"
}

Но я получаю:

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

Как я могу опубликовать ObjectId, или мне нужен какой-то атрибут наимущество такого типа?

Спасибо

1 Ответ

2 голосов
/ 25 апреля 2019

Вы получаете это исключение, потому что Newtonsoft.Json не может преобразовать отправляемую вами строку в ObjectId MongoDB. Чтобы исправить это, вы можете реализовать свой собственный 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; }
}
...