Docs Menu
Docs Home
/ /

Trabajar con datos JSON extendidos

En esta guía, puede aprender a utilizar el formato de datos JSON extendido al interactuar con documentos MongoDB.

JSON es un formato de datos legible que representa los valores de objetos, matrices, números, cadenas, valores booleanos y valores nulos. Este formato solo admite un subconjunto de tipos de datos BSON, que es el formato que MongoDB utiliza para almacenar datos. El formato JSON extendido admite más tipos BSON y 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.

Para obtener más información sobre JSON, BSON y JSON extendido, consulte Entrada manual del servidorMongoDB JSON, BSON y recursos 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

Extendidoo canónico

A string format that avoids loss of BSON type information during data conversions.
This format prioritizes type preservation at the loss of human-readability and interoperability with older formats. To learn more about this format, see JsonMode.EXTENDED in the API documentation.

Relajado

A string format that describes BSON documents with some type information loss.
This format prioritizes human-readability and interoperability at the loss of certain type information. The Kotlin Sync driver uses Relaxed mode by default. To learn more about this format, see JsonMode.RELAXED in the API documentation.

Shell

A string format 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. To learn more about this format, see JsonMode.SHELL in the API documentation.

Nota

El controlador Kotlin Sync analiza el $uuid tipo JSON extendido de una cadena a un Binary 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.

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

Esta sección muestra cómo leer valores JSON extendidos en objetos Kotlin de las siguientes maneras:

Para leer una cadena JSON extendida en un objeto de documento Kotlin, llame al método estático parse() de la clase Document o BsonDocument. Este método analiza la cadena 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 JSON extendida 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}}

Para leer una cadena JSON extendida en objetos Kotlin sin usar las clases de documento del controlador Kotlin Sync, utilice la clase JsonReader de la biblioteca BSON. Esta clase contiene métodos para analizar secuencialmente los campos y valores de la cadena JSON extendida y devolverlos como objetos Kotlin. Las clases de documento del controlador también utilizan esta clase para analizar JSON extendida.

El siguiente código utiliza métodos proporcionados por la clase JsonReader para convertir una cadena 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

Esta sección muestra cómo escribir valores JSON extendidos desde objetos Kotlin de las siguientes maneras:

Para escribir una cadena JSON extendida desde un objeto Document o BsonDocument, llame al método toJson(). Puede pasarle a este método un parámetro de objeto JsonWriterSettings para especificar el formato JSON extendido.

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}

Para generar una cadena JSON extendida a partir de datos almacenados en objetos Kotlin, puede usar la clase JsonWriter de la biblioteca BSON. Para construir un objeto 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 usa el formato de modo relajado. Las clases de documento del controlador Kotlin Sync también usan 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"}}

Además de especificar el formato de salida JSON extendido, puede personalizar aún más la salida añadiendo conversores a su objeto JsonWriterSettings. Estos métodos de conversión especifican la lógica para gestionar diferentes tipos de datos durante el proceso de conversión.

El siguiente ejemplo convierte el mismo documento que el ejemplo "Usar las clases de documento". Sin embargo, este ejemplo define los objectIdConverter() dateTimeConverter() métodos de conversión y en un JsonWriterSettings objeto 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}

Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API:

Volver

Time Series

En esta página