2016-06-20 55 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

相關問題