Docs Menu
Docs Home
/ /

Formato de datos del documento: JSON extendido

En esta guía, puede aprender a utilizar el formato JSON extendido en el controlador MongoDB Kotlin.

JSON es un formato de datos que representa los valores de objetos, matrices, números, cadenas, valores booleanos y nulos. El formato JSON extendido define un conjunto reservado de claves con el prefijo "$" para representar información de 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 biblioteca BSON para convertir entre objetos JSON extendidos y Kotlin

  • Cómo crear una conversión personalizada de tipos BSON

Para obtener más información sobre la diferencia entre estos formatos, consulte nuestra Artículo sobre JSON y BSON.

MongoDB Extended JSON ofrece diferentes formatos de cadena para representar datos BSON. Cada formato cumple con la RFC de JSON y satisface casos de uso específicos. El formato extendido, también conocido como formato canónico, ofrece representaciones específicas para cada tipo de BSON, lo que permite una conversión bidireccional sin pérdida de información. El formato de modo relajado es más conciso y similar al JSON convencional, 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 $uuid tipo JSON extendido de una cadena a un BsonBinary objeto de subtipo 4 binario. Para obtener más información sobre el análisis $uuid de campos, consulte la sección "Reglas especiales para el análisis de campos $uuid" en la especificación JSON extendida.

Para obtener información más detallada sobre estos formatos, consulte los siguientes recursos:

Los siguientes ejemplos muestran un documento que contiene un campo ObjectId, una fecha y un número largo, representados en cada formato JSON extendido. Haga clic en la pestaña correspondiente al formato del ejemplo que desea 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" }
}

Puedes leer una cadena JSON extendida en un objeto de documento Kotlin llamando al método estático parse() desde la clase Document o BsonDocument, según el tipo de objeto que necesites. Este método analiza la cadena JSON extendida en cualquier formato y devuelve una instancia de esa clase que contiene los datos.

El siguiente ejemplo muestra cómo puede utilizar la clase Document para leer una cadena JSON extendida de ejemplo en un objeto Document utilizando 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, consulte nuestra página de Fundamentos en Guía de documentos.

También puede leer una cadena JSON extendida en objetos Kotlin sin usar las clases de documento del controlador Kotlin de MongoDB mediante la clase JsonReader. Esta clase contiene métodos para analizar secuencialmente los campos y valores de la cadena JSON extendida en cualquier formato y los devuelve como objetos Kotlin. Las clases de documento del controlador también utilizan esta clase para analizar JSON extendida.

El siguiente ejemplo de código muestra cómo puede utilizar la clase JsonReader para convertir una cadena JSON extendida en objetos 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 obtener más información, consulte la documentación de la API de JsonReader.

Puede escribir una cadena JSON extendida desde una instancia de Document o BsonDocument llamando al método toJson(), pasándole opcionalmente una instancia de JsonWriterSettings para especificar el formato JSON extendido.

En este ejemplo, generamos 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}

También puede generar una cadena JSON extendida a partir de datos en objetos Kotlin utilizando la biblioteca BSON con la clase JsonWriter. Para construir una instancia de JsonWriter, pase una subclase de Java Writer para especificar cómo desea generar el JSON extendido. Opcionalmente, puede pasar una instancia JsonWriterSettings para especificar opciones como el formato JSON extendido. De forma predeterminada, JsonWriter utiliza el formato de modo relajado. Las clases de documento del controlador Kotlin de MongoDB también utilizan 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 API:

Además de especificar el outputMode() para formatear la salida JSON, puede personalizarla aún más añadiendo convertidores a su 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 agregar convertidores, definidos como expresiones lambda, para simplificar la salida JSON del 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 API:

Volver

BSON

En esta página