我使用 .NET Core API 和 MongoDB 作为我的数据库。 我正在尝试为一个集合创建一个简单的 CRUD 操作。 API 的 GET 方法工作正常,但我收到 POST 调用错误。我尝试了几种可用的选项,但似乎没有任何效果。
错误如下:
MongoDB.Bson.BsonSerializationException:序列化类 Datasparkx_Model.AdminForm.AdminFormModel 的 Metadata 属性时发生错误:类型 System.Text.Json.JsonElement 未配置为允许为此 ObjectSerializer 实例序列化的类型。
模型类=>
public class MyModel
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string? Id { get; set; }
public Object[] Testdata { get; set; }
}
控制器调用=>
[HttpPost(Name = "AddData")]
public async Task<bool> Post(MyModel document)
{
await _myCollection.InsertOneAsync(document);
}
Javascript 调用
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"testData": [
{
"data1": "name",
"data2": "textfield",
"data3": true
},
{
"data1": "email",
"data3": "email",
"data4": true
},
{
"randomData": "address",
"newData": false,
"anyData": "textarea"
}
]
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://localhost:7051/AddData", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
参数在控制器级别按预期正确传递,但它没有在我的数据库中添加任何数据并引发上述错误。
有人可以指导我吗,因为我是 MongoDB 新手。
当您将
Testdata
声明为 Object[]
时,类型:
public Object[] Testdata { get; set; }
当
JsonSerializer
反序列化请求数据时,Testdata
中的对象会默认定义为JsonElement
。并且 MongoDB .NET 驱动程序 / BsonSerializer
不支持(反)序列化 JsonElement
。
要么:
有额外的实现将
JsonElement
转换为BsonElement
,如@dbc关于如何有效地将JsonElement转换为BsonDocument?的答案
通过
document
序列化 System.Text.Json.JsonSerializer
并使用 MongoDB.Bson.Serialization.BsonSerializer
反序列化。
注意,使用此方法时,应排除反序列化
Id
,以防止出现模型类中找不到Id
的错误。或者您可以将 [BsonIgnoreExtraElements]
属性应用于 MyModel
类。
using System.Text.Json;
using System.Text.Json.Serialization;
using MongoDB.Bson.Serialization;
string serializedJson = JsonSerializer.Serialize(document, new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
});
document = BsonSerializer.Deserialize<MyModel>(json);
await _collection.InsertOneAsync(document);
演示