2014-11-25 15 views
5

Sto lavorando con il driver MongoDB C#. Ho un BsonDocument con alcuni dati che include alcuni tipi specifici di MongoDB (come ObjectID e ISODates). Voglio convertirlo in una stringa JSON generica valida. In altre parole, non posso avere qualcosa come _id: ObjectId(...) o date: ISODate(...) ma preferirei _id: "..." e date: "...". Fondamentalmente, voglio convertire questi tipi speciali che solo MongoDB riconosce alle stringhe regolari in modo che possano essere analizzati più facilmente. Il problema è che una funzione built-in come .ToJson() (che suggerisce un'altra risposta StackOverflow) in realtà non converte il documento in JSON valido perché mantiene questi tipi speciali. Il mio documento contiene anche molti livelli di array e sotto-documenti, quindi un semplice ciclo for non è sufficiente. Qual è il modo migliore per convertire un BsonDocument che eviti questo problema? Preferirei qualcosa di built-in piuttosto che ricorrere manualmente nel documento per risolvere tutti i problemi.Converti MongoDB BsonDocument in JSON valido in C#

risposta

0

La maggior parte del tempo per questo che uso, Json.NET

JsonConvert.SerializeObject(obj); 

maggior parte del tempo che fa il trucco. In caso di necessità è possibile impostare alcune JsonSerializerSettings

8

ho incontrato la stessa cosa, è possibile ottenere validi JSON tramite:

var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict }; 
JObject json = JObject.Parse(postBsonDoc.ToJson<MongoDB.Bson.BsonDocument>(jsonWriterSettings)); 

Tuttavia tornerà qualcosa come:

{"_id":{"$oid":"559843798f9e1d0fe895c831"}, "DatePosted":{"$date":1436107641138}} 

Sto ancora cercando di trovare un modo per appiattirlo.

+0

hai mai avuto fortuna? –

+0

Troll macchiato: https://github.com/mongodb/mongo-csharp-driver-jsondotnet/blob/master/src/MongoDB.Integrations.JsonDotNet/Converters/ObjectIdConverter.cs#L100 –

1

Ecco come l'ho fatto, per saltare l'ingresso di mongodb _id.

var collection = _database.GetCollection<BsonDocument>("test"); 

var result = await collection.Find(new BsonDocument()) 
    .Project(Builders<BsonDocument>.Projection.Exclude("_id")) 
    .ToListAsync(); 
var obj = result.ToJson();