Overview
En esta guía, puede aprender a utilizar el formato de datos JSON extendido cuando interactúe con documentos de MongoDB.
JSON es un formato de datos legible por humanos que representa los valores de objetos, arreglos, números, cadenas, booleanos y nulos. Este formato solo admite un subconjunto de tipos de datos BSON, que es el formato que utiliza MongoDB para almacenar datos. El formato Extended JSON admite más BSON types, definiendo un conjunto reservado de claves con el prefijo "$" para representar información del tipo de campo que corresponde directamente a cada tipo en BSON.
Para obtener más información sobre JSON, BSON y JSON extendido, consulta el recurso JSON y BSON y la entrada del manual JSON extendido de MongoDB Server.
Formatos JSON extendidos
MongoDB Extended JSON proporciona formatos de string para representar datos BSON. Cada formato cumple con la RFC JSON y satisface casos de uso específicos.
La siguiente tabla describe cada formato JSON extendido:
Nombre | Descripción |
|---|---|
Extendido o Canónico | Un formato de string que evita la pérdida de información de tipo BSON durante las conversiones de datos. |
Relajado | Un formato de string que describe documentos BSON con cierta pérdida de información de tipo. |
Shell | Un formato de string que coincide con la sintaxis utilizada en el shell de MongoDB. |
reglas especiales para analizar campos $uuid
Ejemplos de JSON extendido
Los siguientes ejemplos muestran un documento que contiene un campo ObjectId, una fecha y un número largo representado en cada formato Extendido de JSON. Haz clic en la pestaña que corresponda al formato del ejemplo que desees ver:
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": { "$numberLong": "1601499609" }}, "numViews": { "$numberLong": "36520312" } }
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": "2020-09-30T18:22:51.648Z" }, "numViews": 36520312 }
{ "_id": ObjectId("573a1391f29313caabcd9637"), "createdAt": ISODate("2020-09-30T18:22:51.648Z"), "numViews": NumberLong("36520312") }
Leer JSON extendido
Esta sección muestra cómo leer valores extendidos de JSON en objetos de Kotlin de las siguientes maneras:
Utiliza las Clases de Documento
Para leer una string JSON extendida en un objeto de documento de Kotlin, llama al método estático parse() de la clase Document o BsonDocument. Este método analiza la string JSON extendida y almacena sus datos en una instancia de la clase de documento especificada.
El siguiente ejemplo utiliza el método parse() para leer una cadena Extended JSON en un objeto Document:
val ejsonStr = """ { "_id": { "$${"oid"}": "507f1f77bcf86cd799439011" }, "myNumber": { "$${"numberLong"}": "4794261" } } """.trimIndent() val doc = Document.parse(ejsonStr) println(doc)
Document{{_id=507f1f77bcf86cd799439011, myNumber=4794261}}
Usa la clase JsonReader
Para leer una cadena JSON Extendida en objetos de Kotlin sin utilizar las clases de documentos del driver Kotlin Sync, use la clase JsonReader de la librería BSON. Esta clase contiene métodos para analizar de forma secuencial los campos y valores de la string JSON Extendida y devolverlos como objetos de Kotlin. Las clases de documentos del driver también utilizan esta clase para analizar JSON extendido.
El siguiente código usa métodos proporcionados por la clase JsonReader para convertir una string JSON extendida en objetos Kotlin:
val string = """ { "_id": { "$${"oid"}": "507f1f77bcf86cd799439011" }, "myNumber": { "$${"numberLong"}": "4794261" } } """.trimIndent() val jsonReader = JsonReader(string) jsonReader.readStartDocument() // Reads the "_id" field value jsonReader.readName("_id") val id = jsonReader.readObjectId() // Reads the "myNumber" field value jsonReader.readName("myNumber") val myNumber = jsonReader.readInt64() jsonReader.readEndDocument() println("$id is type: ${id::class.qualifiedName}") println("$myNumber is type: ${myNumber::class.qualifiedName}") jsonReader.close()
507f1f77bcf86cd799439011 is type: org.bson.types.ObjectId 4794261 is type: kotlin.Long
Guardar Extended JSON
Esta sección muestra cómo escribir valores de Extended JSON a partir de objetos Kotlin de las siguientes maneras:
Utiliza las Clases de Documento
Para guardar una cadena Extended JSON a partir de un objeto Document o BsonDocument, llama al método toJson(). Puedes pasar a este método un parámetro de objeto JsonWriterSettings para especificar el formato JSON ampliado.
El siguiente ejemplo escribe datos Document como JSON extendido en modo relajado:
val doc = Document() .append("_id", ObjectId("507f1f77bcf86cd799439012")) .append("createdAt", Date.from(Instant.ofEpochMilli(1601499609000L))) .append("myNumber", 4794261) val settings = JsonWriterSettings.builder() .outputMode(JsonMode.RELAXED) .build() println(doc.toJson(settings))
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "createdAt": {"$date": "2020-09-30T21:00:09Z"}, "myNumber": 4794261}
Utiliza la clase JsonWriter
Para generar una cadena JSON extendida a partir de datos almacenados en objetos de Kotlin, puedes utilizar la clase JsonWriter de la librería BSON. Para construir un objeto JsonWriter, pasa una subclase de un Writer de Java para especificar cómo quiere generar la salida del JSON extendido. Opcionalmente, puedes pasar una instancia de JsonWriterSettings para especificar opciones, como el formato Extended JSON. Por defecto, JsonWriter utiliza el formato de modo relajado. Las clases de documentos del controlador Kotlin Sync también utilizan esta clase para convertir BSON a JSON extendido.
El siguiente ejemplo utiliza un objeto JsonWriter para crear valores de string Extended JSON en modo canónico y exportarlos a System.out:
val settings = JsonWriterSettings.builder() .outputMode(JsonMode.EXTENDED) .build() JsonWriter(BufferedWriter(OutputStreamWriter(System.out)), settings).use { jsonWriter -> jsonWriter.writeStartDocument() jsonWriter.writeName("_id") jsonWriter.writeObjectId(ObjectId("507f1f77bcf86cd799439012")) jsonWriter.writeName("myNumber") jsonWriter.writeInt64(11223344L) jsonWriter.writeEndDocument() jsonWriter.flush() }
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "myNumber": {"$numberLong": "11223344"}}
Conversión personalizada de tipos BSON
Además de especificar el formato de salida JSON extendido, puedes personalizar aún más la salida añadiendo convertidores a tu objeto JsonWriterSettings. Estos métodos convertidores especifican la lógica para manejar diferentes tipos de datos durante el proceso de conversión.
El siguiente ejemplo convierte el mismo documento que el ejemplo Utilizar las clases de documentos. Sin embargo, este ejemplo define los métodos de conversión objectIdConverter() y dateTimeConverter() en un objeto JsonWriterSettings para simplificar la salida JSON extendida en modo relajado:
val settings = JsonWriterSettings.builder() .outputMode(JsonMode.RELAXED) .objectIdConverter { value, writer -> writer.writeString(value.toHexString()) } .dateTimeConverter { value, writer -> val zonedDateTime = Instant.ofEpochMilli(value).atZone(ZoneOffset.UTC) writer.writeString(DateTimeFormatter.ISO_DATE_TIME.format(zonedDateTime)) } .build() val doc = Document() .append("_id", ObjectId("507f1f77bcf86cd799439012")) .append("createdAt", Date.from(Instant.ofEpochMilli(1601499609000L))) .append("myNumber", 4794261) println(doc.toJson(settings))
{"_id": "507f1f77bcf86cd799439012", "createdAt": "2020-09-30T21:00:09Z", "myNumber": 4794261}
Documentación de la API
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: