【问题标题】:Web API + MongoDB: list of arbitrary objects?Web API + MongoDB:任意对象列表?
【发布时间】:2017-11-21 13:17:08
【问题描述】:

我有一个 .Net Core 2.0 Web API,我在其中使用 MongoDB .net 驱动程序。

我有一个班级叫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" : []
                }
            }
        }
    ]
}

我知道如果我使用指定类型的列表(例如类或结构)它会起作用,但我需要该列表是动态对象,因为我不知道客户端可以发送哪些对象。

我需要做什么才能使数据库中保存的数据可读?

【问题讨论】:

  • 您能否在 C# 中添加元数据类的示例?您的问题与 Newtonsoft.Json 有关;与MongoDB驱动无关。
  • 我没有元数据属性的类。它应该是客户端发送的动态 JSON 数组。我的代码中什至没有对 Newtonsoft.Json 的引用,所以我不知道它为什么会出现在那里。
  • 哦,我明白了。所以,您希望数据库中的数据与请求中的数据相同,对吧?
  • 是的,不然以后拉不回来了。

标签: c# asp.net-web-api mongodb-.net-driver


【解决方案1】:

使用Dictionary&lt;string, object&gt; 表示未知结构的数据。

这既适用于 Newtonsoft.Json(ASP.NET Web API 中的默认序列化程序),也适用于 MongoDB.Driver 的 BSON 序列化程序。

如下更改ListOfValues类:

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 中。

经测试

  • ASP.NET Core 2.0 Web API
  • Newtonsoft.Json 10.0.3
  • MongoDB.Driver 2.4.4
  • MongoDB 服务器 3.4 w/WiredTiger

【讨论】:

  • 它是如此简单明了,我不知道我是怎么错过的。但是,我还在 MongoDB 手册中找到了一个非常有用的链接,其中涵盖了许多有关使用 MongoDB C# 驱动程序的有趣材料 - Serialize Documents with the CSharp Driver
  • 对我来说,使用Dictionary&lt;string,object&gt; 只是避免使用“_t”和“_v”作为顶级值。对于嵌套值,它仍然使用 _t 和 _v。有什么想法吗?
  • @Meglio 能否让它与嵌套值一起使用?
  • @hahaha 不幸的是没有
  • @Meglio 如果您仍然对解决方案感兴趣,这帮助了我stackoverflow.com/a/47515074/3522714
猜你喜欢
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2021-02-01
  • 2017-11-13
相关资源
最近更新 更多