.NET API 错误:类型 System.Text.Json.JsonElement 未配置为允许为此 ObjectSerializer 实例序列化的类型

问题描述 投票:0回答:1

我使用 .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 新手。

c# mongodb asp.net-core asp.net-core-webapi mongodb-.net-driver
1个回答
2
投票

当您将

Testdata
声明为
Object[]
时,类型:

public Object[] Testdata { get; set; }

JsonSerializer
反序列化请求数据时,
Testdata
中的对象会默认定义为
JsonElement
。并且 MongoDB .NET 驱动程序 /
BsonSerializer
不支持(反)序列化
JsonElement

要么:

  1. 有额外的实现将

    JsonElement
    转换为
    BsonElement
    ,如@dbc关于如何有效地将JsonElement转换为BsonDocument?

    的答案
  2. 通过

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

演示

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.