Menu Docs
Página inicial do Docs
/ / /
Scala
/

Extended JSON

Nesta página

  • Visão geral
  • Gravando JSON
  • Lendo JSON
  • Lendo e gravando JSON diretamente
  • Lendo e escrevendo JSON com CustomSettings

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 tipos de BSON que estão em conformidade com a JSON RFC. Este é o formato que o mongoexport produz e o mongoimport consome.

  • Modo de shell: um superconjunto de JSON que o shell do MongoDB pode 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ância Document em uma string JSON

  • Document(<json>): um conjunto de métodos de fábrica estáticos sobrecarregados que convertem uma string JSON em uma instância Document

Considere a tarefa de implementar uma ferramenta semelhante à mongoexportusando 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 exemplo, considere a tarefa de gravar uma string JSON que possa ser copiada e colada no shell do MongoDB:

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") } }

Considere a tarefa de implementar uma ferramenta semelhante à mongoimportusando 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 auxiliar 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.

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/gravação JSON, JsonObjectCodec, faz parte do registro padrão, portanto, 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()

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

Voltar

macros