2016-06-20 115 views
0

我一直在这工作,并设法让json解析成一个C#对象。现在下一步是将一个json数组解析为一个List。我已成功地完成这项工作,但我敢肯定有一个更好的办法从BsonArray转换到一个列表将BsonArray转换成列表<T>

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的实体表示。


正如安德烈指出它工作正常:

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并重试。

回答

1

要么完全键入,要么完全没有键入。

强类型

假设这些都是你的类型:

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

测试utils的:

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); 
} 
+0

我不知道我知道如何适用?我得到一个JSON文档,我需要补充水分到列表? – GPGVM

+0

就像序列化到json字符串的方式一样,你反序列化的方法 –

+0

好的......我很早就试过......可能做错了什么。让我再试一次并更新。 – GPGVM