Extended JSON
Nesta página
Visão geral
O driver Scala oferece suporte à leitura e gravação de documentos BSON representados como MongoDB Extended JSON. Ambas as variantes a seguir são suportadas:
Modo rigoroso: representações de BSON types que estão em conformidade com a JSON RFC. Este é o formato que o mongoexport produz e o mongoimport consome.
shell Modo : um superconjunto de JSON que o do pode MongoDB shell analisar.
Além disso, o tipo Document
fornece dois conjuntos de métodos de conveniência para essa finalidade:
Document.toJson()
: um conjunto de métodos sobrecarregados que convertem uma instânciaDocument
em uma string JSONDocument(<json>)
: um conjunto de métodos de fábrica estáticos sobrecarregados que convertem uma string JSON em uma instânciaDocument
Gravando JSON
Considere a tarefa de implementar uma ferramenta semelhante à mongoexport
usando o driver:
val fileName = // initialize to the path of the file to write to val collection = // initialize the collection from which you want to query val writer: PrintWriter = new PrintWriter(fileName) collection.find().subscribe( (doc: Document) => output.write(s"${doc.toJson}\r\n"), (t: Throwable) => // handle failure, () => output.close())
O método Document.toJson()
constrói uma instância de um JsonWriter
com suas configurações padrão, que escreve no modo estrito sem novas linhas ou recuo.
Você pode substituir esse comportamento padrão usando uma das sobrecargas de toJson()
. Como um exemplo, considere a tarefa de gravar uma string JSON que possa ser copiada e colada no MongoDB shell:
import java.text.SimpleDateFormat val fmt = new SimpleDateFormat("dd/MM/yy") val first = fmt.parse("01/01/2014") val second = fmt.parse("01/01/2015") val doc = Document("startDate" -> Document("$gt" -> first, "$lt" -> second)) println(doc.toJson(new JsonWriterSettings(JsonMode.SHELL)))
Este trecho de código imprimirá JSON compatível com shell MongoDB , que pode então ser colado no shell:
{ "startDate" : { "$gt" : ISODate("2014-01-01T05:00:00.000Z"), "$lt" : ISODate("2015-01-01T05:00:00.000Z") } }
Lendo JSON
Considere a tarefa de implementar uma ferramenta semelhante à mongoimport
usando o driver:
import scala.io.Source val fileName = // initialize to the path of the file to read from val collection = // initialize the collection from which you want to import to try { for (json <- Source.fromFile(fileName).getLines()) { collection.insertOne(Document(json)).head() } } catch { case ex: Exception => println("Bummer, an exception happened.") }
O método assistente complementar Document(<json>)
constrói uma instância de um JsonReader
com a string fornecida e retorna uma instância de uma instância Document
equivalente. JsonReader
detecta automaticamente o sabor JSON na string, portanto, você não precisa especificá-lo.
Lendo e gravando JSON diretamente
Se você não precisar de um documento e quiser lidar apenas com JSON, poderá usar um JsonObject
para ler e escrever JSON diretamente. JsonObject
é uma classe wrapper que recebe um String
no construtor e retorna o String
no método getJson()
. Ler e escrever JSON diretamente é mais eficiente do que construir um Document
primeiro e depois chamar toJson()
, e também é mais eficiente do que chamar Document#parse()
.
O codec responsável pela leitura/escrita JSON, JsonObjectCodec
, faz parte do registro padrão, portanto, fazer isso é muito simples e demonstrado pelo exemplo a seguir:
val database: MongoDatabase = mongoClient.getDatabase("mydb") val collection: MongoCollection[JsonObject] = database.getCollection("test") collection.insertOne(new JsonObject("{hello: 1}")).printResults() val jsonObject: SingleObservable[JsonObject] = collection.find.first()
Lendo e escrevendo JSON com CustomSettings
Você também pode fornecer JsonWriterSettings
personalizado para o JsonObjectCodec
, construindo o codec e, em seguida, criando um registro:
val codecRegistry = fromRegistries( fromCodecs(new JsonObjectCodec(JsonWriterSettings .builder() .outputMode(JsonMode.EXTENDED) .build())), DEFAULT_CODEC_REGISTRY ) val database: MongoDatabase = mongoClient.getDatabase("mydb").withCodecRegistry(codecRegistry) val collection: MongoCollection[JsonObject] = database.getCollection("test") collection.insertOne(new JsonObject("{hello: 1}")).printResults() val jsonObject: SingleObservable[JsonObject] = collection.find.first()