Web API + MongoDB:任意对象列表?
Web API + MongoDB: list of arbitrary objects?
我有一个 .Net Core 2.0 Web API,我在其中使用 MongoDB .net 驱动程序。
我有一个 class 叫 ListOfValues
:
public class ListOfValues
{
public string ListName { get; set; }
public List<object> MetaData { get; set; }
}
我控制器的保存端点是:
public class LovController : Controller
{
[HttpPost]
public async Task<IActionResult> Create([FromBody] ListOfValues lov)
{
if (!ModelState.IsValid)
return BadRequest();
await ldbContext.GetCollection<ListOfValues>("ListOfValues").InsertOneAsync(lov);
return CreatedAtAction("Create", new { Id = lov.Id });
}
}
我正在发布此数据:
{
"listName": "test",
"MetaData": [{
"Name": "Text",
"FieldType": "TextBox",
"isActive": 1
}]
}
出于某种原因,当我查询数据库时,我看到了这个值:
{
"_id" : ObjectId("5a1421e644d7cb07a8d3c45d"),
"ListName" : "test",
"MetaData" : [
{
"_t" : "Newtonsoft.Json.Linq.JObject, Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed",
"_v" : {
"Name" : {
"_t" : "JValue",
"_v" : []
},
"FieldType" : {
"_t" : "JValue",
"_v" : []
},
"isActive" : {
"_t" : "JValue",
"_v" : []
}
}
}
]
}
我知道如果我使用指定类型的列表,例如 class 或结构,它会起作用,但我需要列表是一个动态对象,因为我不知道客户端是哪些对象可以发。
数据库中保存的数据需要做些什么才能可读?
使用Dictionary<string, object>
表示未知结构的数据。
这既适用于 Newtonsoft.Json,它是 ASP.NET Web API 中的默认序列化程序,也适用于 MongoDB.Driver.
的 BSON 序列化程序
将ListOfValues
class改成如下:
public class ListOfValues
{
[JsonIgnore]
public ObjectId Id { get; set; }
public string ListName { get; set; }
public List<Dictionary<string,object>> MetaData { get; set; }
}
需要 Id
属性 才能从数据库中获取数据。使用 JsonIgnore
属性,它不会出现在控制器的 JSON returned/received 中。
测试:
- ASP.NET 核心 2.0 网络 API
- Newtonsoft.Json 10.0.3
- MongoDB.Driver2.4.4
- MongoDB 服务器 3.4 w/WiredTiger
我有一个 .Net Core 2.0 Web API,我在其中使用 MongoDB .net 驱动程序。
我有一个 class 叫 ListOfValues
:
public class ListOfValues
{
public string ListName { get; set; }
public List<object> MetaData { get; set; }
}
我控制器的保存端点是:
public class LovController : Controller
{
[HttpPost]
public async Task<IActionResult> Create([FromBody] ListOfValues lov)
{
if (!ModelState.IsValid)
return BadRequest();
await ldbContext.GetCollection<ListOfValues>("ListOfValues").InsertOneAsync(lov);
return CreatedAtAction("Create", new { Id = lov.Id });
}
}
我正在发布此数据:
{
"listName": "test",
"MetaData": [{
"Name": "Text",
"FieldType": "TextBox",
"isActive": 1
}]
}
出于某种原因,当我查询数据库时,我看到了这个值:
{
"_id" : ObjectId("5a1421e644d7cb07a8d3c45d"),
"ListName" : "test",
"MetaData" : [
{
"_t" : "Newtonsoft.Json.Linq.JObject, Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed",
"_v" : {
"Name" : {
"_t" : "JValue",
"_v" : []
},
"FieldType" : {
"_t" : "JValue",
"_v" : []
},
"isActive" : {
"_t" : "JValue",
"_v" : []
}
}
}
]
}
我知道如果我使用指定类型的列表,例如 class 或结构,它会起作用,但我需要列表是一个动态对象,因为我不知道客户端是哪些对象可以发。
数据库中保存的数据需要做些什么才能可读?
使用Dictionary<string, object>
表示未知结构的数据。
这既适用于 Newtonsoft.Json,它是 ASP.NET Web API 中的默认序列化程序,也适用于 MongoDB.Driver.
的 BSON 序列化程序将ListOfValues
class改成如下:
public class ListOfValues
{
[JsonIgnore]
public ObjectId Id { get; set; }
public string ListName { get; set; }
public List<Dictionary<string,object>> MetaData { get; set; }
}
需要 Id
属性 才能从数据库中获取数据。使用 JsonIgnore
属性,它不会出现在控制器的 JSON returned/received 中。
测试:
- ASP.NET 核心 2.0 网络 API
- Newtonsoft.Json 10.0.3
- MongoDB.Driver2.4.4
- MongoDB 服务器 3.4 w/WiredTiger