Overview
En esta guía, puedes aprender a usar el formato JSON extendido en el controlador MongoDB Kotlin.
JSON es un formato de datos que representa los valores de objetos, arreglos, números, cadenas, booleanos y nulos. El formato JSON extendido define un conjunto reservado de claves con el prefijo “$" para representar información del tipo de campo que corresponde directamente a cada tipo en BSON, el formato que MongoDB utiliza para almacenar datos.
Esta guía explica los siguientes temas:
Los diferentes formatos JSON extendidos de MongoDB
Cómo usar la librería BSON para convertir entre JSON extendido y objetos Kotlin
Cómo crear una conversión personalizada de BSON types
Para obtener más información sobre la diferencia entre estos formatos, consulte nuestro artículo sobre JSON y BSON.
Formatos JSON extendidos
MongoDB Extended JSON presenta diferentes formatos de string para representar los datos BSON. Cada uno de los diferentes formatos se ajusta al RFC de JSON y satisface casos de uso específicos. El formato extendido, también conocido como el formato canónico, presenta representaciones específicas para cada tipo BSON para una conversión bidireccional sin pérdida de información. El formato modo relajado es más conciso y se asemeja más al JSON ordinario, pero no representa toda la información de tipo, como el tamaño de bytes específico de los campos numéricos.
Consulte la siguiente tabla para ver una descripción de cada formato:
Nombre | Descripción |
|---|---|
Extendido | Also known as the canonical format, this JSON representation avoids loss of BSON type information. This format prioritizes type preservation at the loss of human-readability and interoperability with older formats. |
Modo Relajado | JSON representation that describes BSON documents with some type information loss. This format prioritizes human-readability and interoperability at the loss of certain type information. |
Shell | JSON representation that matches the syntax used in the MongoDB shell. This format prioritizes compatibility with the MongoDB shell which often uses JavaScript functions to represent types. |
Estricto | Deprecated. This representation is the legacy format that fully conforms to the JSON RFC which allows any JSON parser to read the type information. The legacy API uses this format. |
Nota
El controlador analiza el tipo $uuid Extended JSON de un string a un objeto BsonBinary de subtipo binario 4. Para obtener más información sobre el análisis del campo $uuid, consulta la sección de reglas especiales para analizar los campos $uuid en la especificación JSON extendida.
Para obtener información más detallada sobre estos formatos, consulte los siguientes recursos:
JSON RFC Documentación oficial
MongoDB Extended JSON Ingreso Manual del Servidor
BsonBinary Documentación de la API
Especificación extendida de JSON Documentación de GitHub
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") }
{ "_id:": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": 1601499609 }, "numViews": { "$numberLong": "36520312" } }
Leer JSON extendido
Uso de las clases de documentos
Puedes leer una cadena Extended JSON en un objeto de documento Kotlin llamando al método estático parse() de la clase Document o BsonDocument, dependiendo del tipo de objeto Realm que necesites. Este método analiza la string Extended JSON en cualquiera de los formatos y devuelve una instancia de esa clase que contiene los datos.
El siguiente ejemplo muestra cómo puedes usar la clase Document para leer una string JSON extendida de ejemplo en un objeto Document usando el método parse():
val ejsonStr = """ { "_id": { "${"$"}oid": "507f1f77bcf86cd799439011"}, "myNumber": {"${"$"}numberLong": "4794261" }} """.trimIndent() val doc = Document.parse(ejsonStr) println(doc)
Document{{_id=507f1f77bcf86cd799439011, myNumber=4794261}}
Para obtener más información, consulta nuestra página de Fundamentos sobre Guía de Documentos.
Uso de la librería BSON
También puedes leer una string Extended JSON a objetos de Kotlin sin utilizar las clases de documento del driver MongoDB Kotlin usando la clase JsonReader. Esta clase contiene métodos para analizar secuencialmente los campos y valores en cualquier formato de la string Extended JSON, y los devuelve como objetos de Kotlin. Las clases de documentos del driver también utilizan esta clase para analizar JSON extendido.
El siguiente ejemplo de código muestra cómo puede usar la clase JsonReader para convertir una cadena JSON extendida en objetos de Kotlin:
val ejsonStr = """ { "_id": { "${"$"}oid": "507f1f77bcf86cd799439011"}, "myNumber": {"${"$"}numberLong": "4794261" }} """.trimIndent() val jsonReader = JsonReader(ejsonStr) jsonReader.readStartDocument() jsonReader.readName("_id") val id = jsonReader.readObjectId() jsonReader.readName("myNumber") val myNumber = jsonReader.readInt64() jsonReader.readEndDocument() println(id.toString() + " is type: " + id.javaClass.name) println(myNumber.toString() + " is type: " + myNumber.javaClass.name) jsonReader.close()
507f1f77bcf86cd799439011 is type: org.bson.types.ObjectId 4794261 is type: java.lang.Long
Para más información, consulta la JsonReader Documentación de la API.
Guardar Extended JSON
Uso de las clases de documentos
Se puede crear una string Extended JSON a partir de una instancia de Document o BsonDocument llamando al método toJson(), pasando opcionalmente una instancia de JsonWriterSettings para especificar el formato Extended JSON.
En este ejemplo, producimos el JSON extendido en el formato de modo relajado.
val myDoc = Document().append("_id", ObjectId("507f1f77bcf86cd799439012")) .append("myNumber", 11223344) val settings = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED).build() myDoc.toJson(settings)
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "myNumber": 11223344}
Uso de la librería BSON
También puedes generar una Extended JSON string a partir de datos en objetos de Kotlin utilizando la librería BSON con la clase JsonWriter. Para construir una instancia de JsonWriter, pasa una subclase de una Writer Java para especificar cómo deseas generar la salida del extended JSON. Opcionalmente, se puede pasar una instancia de JsonWriterSettings para especificar opciones como el formato JSON extendido. Por defecto, el JsonWriter utiliza el formato de modo relajado. Las clases de documentos del driver MongoDB Kotlin también usan esta clase para convertir BSON a JSON extendido.
El siguiente ejemplo de código muestra cómo puedes usar JsonWriter para crear una string JSON extendida y enviarla a System.out. Especificamos el formato pasando el método builder outputMode() la constante JsonMode.EXTENDED:
val settings = JsonWriterSettings.builder().outputMode(JsonMode.EXTENDED).build() JsonWriter(BufferedWriter(OutputStreamWriter(System.out)), settings).use { jsonWriter -> jsonWriter.writeStartDocument() jsonWriter.writeObjectId("_id", ObjectId("507f1f77bcf86cd799439012")) jsonWriter.writeInt64("myNumber", 11223344) jsonWriter.writeEndDocument() jsonWriter.flush() }
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "myNumber": {"$numberLong": "11223344"}}
Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de la API:
Conversión personalizada de tipos BSON
Además de especificar el outputMode() para el formato de la salida JSON, puedes personalizar aún más la salida añadiendo convertidores a tu JsonWriterSettings.Builder. Estos métodos de conversión detectan los tipos de Kotlin y ejecutan la lógica definida por el Converter que se les pasa.
El siguiente código de muestra muestra cómo añadir convertidores, definidos como expresiones Lambda, para simplificar la salida JSON en el modo relajado.
val settings = JsonWriterSettings.builder() .outputMode(JsonMode.RELAXED) .objectIdConverter { value, writer -> writer.writeString(value.toHexString()) } .timestampConverter { value, writer -> val ldt = LocalDateTime.ofInstant(Instant.ofEpochSecond(value.time.toLong()), ZoneOffset.UTC) writer.writeString(ldt.format(DateTimeFormatter.ISO_DATE_TIME)) } .build() val doc = Document() .append("_id", ObjectId("507f1f77bcf86cd799439012")) .append("createdAt", BsonTimestamp(1601516589,1)) .append("myNumber", 4794261) println(doc.toJson(settings))
{"_id": "507f1f77bcf86cd799439012", "createdAt": "2020-10-01T01:43:09", "myNumber": 4794261} // Without specifying the converters, the Relaxed mode JSON output // should look something like this: {"_id": {"$oid": "507f1f77bcf86cd799439012"}, "createdAt": {"$timestamp": {"t": 1601516589, "i": 1}}, "myNumber": 4794261}
Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de la API: