gpt4 book ai didi

c# - 将 BsonArray 转换为 List

转载 作者:行者123 更新时间:2023-12-05 05:23:21 24 4
gpt4 key购买 nike

我一直致力于此,并设法将 json 解析为 C# 对象。现在下一步是将一个 json 数组解析为一个列表。我已经设法完成了工作,但我很确定有更好的方法可以将 BsonArray 转换为 List

using (StreamReader file = File.OpenText(filename))
{
try
{
//first up convert to bson
var jsonSampleData = file.ReadToEnd();

//var bsonSampleData = BsonDocument.Parse(jsonSampleData);
//this would be for a single BSOnDocument

var bsonSampleData = BsonSerializer.Deserialize<BsonArray>(jsonSampleData);
var x = bsonSampleData.ToList();

List<ThePlan> lst = new List<ThePlan>();

foreach (var doc in x)
{
var t = BsonSerializer.Deserialize<ThePlan>(doc.AsBsonDocument);
lst.Add(t);
}

}
catch (Exception ex)
{
throw;
}

编辑-附加信息

要清楚我需要完成的是获取给定的 json 文档并将其重新水合到 List。由于我是 mongo 的新手,而且 T 是 mongo 实体表示,这变得更加复杂。


正如 Andrei 指出的那样,它工作正常:

using (StreamReader file = File.OpenText(filename))
{
var jsonSampleData = file.ReadToEnd();
_thePlan = BsonSerializer.Deserialize<List<ThePlan>>(jsonSampleData);
}

想想我昨天的挣扎,我认为这实际上与我的 json 有关,在我早期的尝试中它看起来像这样:

{
"_id": "57509afbc6b48d3f33b2dfcd",
...
}

在弄清楚这一切的过程中,我的 json 成熟到:

{
"_id": { "$oid": "57509afbc6b48d3f33b2dfcd" },
.....
}

我在使用 BsonSerializer 时遇到的麻烦很可能是我的错误 json,一旦解决了这个问题,我就不够机智,无法返回 BsonSerielizer 再试一次。

最佳答案

要么一直使用强类型,要么根本不使用类型。

强类型

假设这些是您的类型:

public class BaseObject {
[BsonId] public ObjectId id { get; set; }
[BsonElement("plans")] public List<ThePlan> Plans { get; set; }
}
public class ThePlan {
[BsonElement("i")] public int Integer { get; set; }
[BsonElement("s")] public string String { get; set; }
}

和这些测试实用程序:

void ToJsonTyped(BaseObject bo)
{
var sb = new StringBuilder();
using (TextWriter tw = new StringWriter(sb))
using (BsonWriter bw = new JsonWriter(tw))
{
BsonSerializer.Serialize<BaseObject>(bw, bo);
}
string jsonObject = sb.ToString();
BaseObject bo2 = BsonSerializer.Deserialize<BaseObject>(jsonObject);
Assert.AreEqual(bo, bo2);
}

void ToBsonTyped(BaseObject bo)
{
byte[] bsonObject = null;
using (var ms = new MemoryStream())
using (BsonWriter bw = new BsonBinaryWriter(ms))
{
BsonSerializer.Serialize<BaseObject>(bw, bo);
bsonObject = ms.ToArray();
}
BaseObject bo1 = BsonSerializer.Deserialize<BaseObject>(bsonObject);
Assert.AreEqual (bo, bo1);
}

你可以测试:

  BaseObject bo = new BaseObject() {
Plans = new List<ThePlan>() {
new ThePlan() {Integer=1, String="one" },
new ThePlan() {Integer=2, String="two" },
new ThePlan() {Integer=3, String="three" } } };
ToBsonTyped(bo);
ToJsonTyped(bo);

根本没有输入BsonDocumentBsonArray 的组合

测试:

  BsonDocument doc = new BsonDocument();
var bsonArray = new BsonArray();
bsonArray.Add(new BsonDocument("one", 1));
bsonArray.Add(new BsonDocument("two", 2));
bsonArray.Add(new BsonDocument("three", 3));
doc.Add( new BsonElement("plans", bsonArray));
ToBsonUnTyped(doc);
ToJsonUnTyped(doc);

测试工具:

void ToBsonUnTyped(BsonDocument doc) {
byte[] bsonObject = null;
using (var ms = new MemoryStream())
using (BsonWriter bw = new BsonBinaryWriter(ms))
{
BsonSerializer.Serialize<BsonDocument>(bw, doc);
bsonObject = ms.ToArray();
}
BsonDocument docActual = BsonSerializer.Deserialize<BsonDocument>(bsonObject);
Assert.AreEqual (doc, docActual);
}

void ToJsonUnTyped(BsonDocument doc)
{
var sb = new StringBuilder();
using (TextWriter tw = new StringWriter(sb))
using (BsonWriter bw = new JsonWriter(tw))
{
BsonSerializer.Serialize<BsonDocument>(bw, doc);
}
string jsonObject = sb.ToString();
BsonDocument doc2 = BsonSerializer.Deserialize<BsonDocument>(jsonObject);
Assert.AreEqual(doc, doc2);
}

关于c# - 将 BsonArray 转换为 List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37932496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com