我的客户端服务生成了一个数据集,其中包括一个 dynamic
字段。这是一个带有非结构化数据的匿名对象。我需要通过 POST 请求将其传输到我的存储服务。
现在我想以接收到的相同方式存储数据,但问题是我的存储服务将其解析为 JObject
,在存储到 MongoDB 中会产生奇怪的数据。在 MongoDB Compass 中,我无法再看到数据集的值。
当前发送以下测试数据:
{
"sessionId" : "202C25C1-DE25-499B-B4F1-1D46FA169A02",
"timestamp" : "5/6/2005 09:34:42 PM",
"type" : "request",
"data" : {
"testField1" : 120,
"testField2" : "Test Value",
"testField3" : [ "value1", "value2" ]
}
}
下面是我从MongoDB获取的内容:
{
"_id": {
"$oid": "6076bceebc1aec06799826dd"
},
"SessionId": {
"$binary": "wSUsICXem0m08R1G+haaAg==",
"$type": "3"
},
"Timestamp": {
"$date": "2005-05-06T19:34:42.000Z"
},
"Type": 0,
"Data": {
"_t": "Newtonsoft.Json.Linq.JObject, Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed",
"_v": {
"testField1": {
"_t": "JValue",
"_v": []
},
"testField2": {
"_t": "JValue",
"_v": []
},
"testField3": {
"_t": "JArray",
"_v": [
{
"_t": "JValue",
"_v": []
},
{
"_t": "JValue",
"_v": []
}
]
}
}
}
}
编辑:此外,将这些数据存储会导致在尝试从数据库检索数据时出现异常。 MongoDB无法反序列化JToken
对象,因为它无法访问某些方法/构造函数。
这几乎是垃圾。我尝试将JSON作为字符串存储,但是MongoDB不会将其存储为实际的JSON对象,而是将其存储为实际字符串,因此破坏了基于文档的存储的意图:
{
"_id": {
"$oid": "6076bc8fbc1aec06799826a5"
},
"SessionId": {
"$binary": "wSUsICXem0m08R1G+haaAg==",
"$type": "3"
},
"Timestamp": {
"$date": "2005-05-06T19:34:42.000Z"
},
"Type": 0,
"Data": "{\"testField1\":120,\"testField2\":\"Test Value\",\"testField3\":[\"value1\",\"value2\"]}"
}
有没有解决方案能让我以同样的方式存储动态对象?我不能简单地将它反序列化成 dynamic
对象,因为这将导致一个 JObject
,因为它实际上是从动态接口派生出来的。但正如所说的,MongoDB 无法正确处理这些对象。
var doc = BsonSerializer.Deserialize<TransactionItem>(request.Data);
进行实际存储之前的反序列化。MongoDB的BsonSerializer类可以很好地处理这个问题。只需要使用自定义的InputFormatter
,将输入数据反序列化并将同样的JSON字符串设置为生成的命令对象的属性即可。有点不太好看,但这是我能找到的唯一有效的解决方案。 - SharpShade