Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Formato de datos de documento: JSON extendido

En esta guía, puedes aprender cómo utilizar el formato JSON extendido en el driver de Java de MongoDB.

JSON es un formato de datos que representa los valores de objetos, arreglos, números, cadenas, booleanos y nulos. El formato Extended JSON define un conjunto reservado de claves con el prefijo "$" para representar la 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 expandido y objetos Java

  • 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.

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

También conocido como formato canónico, esta representación JSON evita la pérdida de información de tipo BSON.
Este formato prioriza la preservación de tipos a costa de la legibilidad y la interoperabilidad con formatos más antiguos.

Modo Relajado

Representación JSON que describe documentos BSON con cierta pérdida de información de tipo.
Este formato da prioridad a la facilidad de lectura humana y a la interoperabilidad a costa de perder cierta información sobre los tipos.

Shell

Representación JSON que coincide con la sintaxis utilizada en la consola de MongoDB.
Este formato prioriza la compatibilidad con la consola de MongoDB, que suele utilizar funciones de JavaScript para representar los tipos.

Estricto

Obsoleto. Esta representación es el formato heredado que se ajusta completamente al RFC de JSON, lo que permite que cualquier analizador de JSON lea la información de tipo.
La API heredada utiliza este formato.

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:

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

Puedes leer una string JSON Extendida en un objeto de documento Java llamando al método estático parse() de la clase Document o BsonDocument, según el tipo de objeto Realm requerido. Este método analiza la string JSON Extendida 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():

String ejsonStr = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\"}," +
"\"myNumber\": {\"$numberLong\": \"4794261\" }}}";
Document doc = Document.parse(ejsonStr);
System.out.println(doc);
Document{{_id=507f1f77bcf86cd799439011, myNumber=4794261}}

Para obtener más información, consulte nuestra página de Conceptos básicos sobre Documentos.

También puedes leer una string Extended JSON en objetos Java sin utilizar las clases de documento del driver Java de MongoDB, utilizando la clase JsonReader. Esta clase contiene métodos para analizar secuencialmente los campos y valores en cualquier formato de la cadena Extended JSON string, y los devuelve como objetos Java. Las clases de documentos del controlador también utilizan esta clase para analizar JSON extendido.

El siguiente ejemplo de código muestra cómo se puede utilizar la clase JsonReader para convertir una string de Extended JSON en objetos Java:

String ejsonStr = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\"}," +
"\"myNumber\": {\"$numberLong\": \"4794261\" }}}";
JsonReader jsonReader = new JsonReader(ejsonStr);
jsonReader.readStartDocument();
jsonReader.readName("_id");
ObjectId id = jsonReader.readObjectId();
jsonReader.readName("myNumber");
Long myNumber = jsonReader.readInt64();
jsonReader.readEndDocument();
System.out.println(id + " is type: " + id.getClass().getName());
System.out.println(myNumber + " is type: " + myNumber.getClass().getName());
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.

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.

Document myDoc = new Document();
myDoc.append("_id", new ObjectId("507f1f77bcf86cd799439012")).append("myNumber", 11223344);
JsonWriterSettings settings = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED).build();
System.out.println(doc.toJson(settings));
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "myNumber": 11223344}

También puedes generar una salida de una string JSON extendida a partir de datos en objetos de Java utilizando la biblioteca BSON con la clase JsonWriter. Para construir una instancia de JsonWriter, pase una subclase de un Writer Java para especificar cómo desea generar la salida de un JSON ampliado. Opcionalmente, puedes transmitir una instancia de JsonWriterSettings para especificar opciones como el formato Extended JSON. De forma predeterminada, el JsonWriter utiliza el formato de modo relajado. Las clases de documentos del driver de MongoDB Java 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:

JsonWriterSettings settings = JsonWriterSettings.builder().outputMode(JsonMode.EXTENDED).build();
try (JsonWriter jsonWriter = new JsonWriter(new BufferedWriter(new OutputStreamWriter(System.out)), settings)) {
jsonWriter.writeStartDocument();
jsonWriter.writeObjectId("_id", new 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:

Además de especificar el outputMode() para formatear la salida JSON, también puedes personalizar aún más la salida añadiendo conversores a tu JsonWriterSettings.Builder. Estos métodos convertidores detectan los tipos de Java y ejecutan la lógica definida por el Converter pasado a ellos.

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.

JsonWriterSettings settings = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED)
.objectIdConverter((value, writer) -> writer.writeString(value.toHexString()))
.dateTimeConverter(
(value, writer) -> {
ZonedDateTime zonedDateTime = Instant.ofEpochMilli(value).atZone(ZoneOffset.UTC);
writer.writeString(DateTimeFormatter.ISO_DATE_TIME.format(zonedDateTime));
})
.build();
Document doc = new Document()
.append("_id", new ObjectId("507f1f77bcf86cd799439012"))
.append("createdAt", Date.from(Instant.ofEpochMilli(1601499609000L)))
.append("myNumber", 4794261);
System.out.println(doc.toJson(settings)));

La salida de este código se asemeja al siguiente texto:

{"_id": "507f1f77bcf86cd799439012", "createdAt": "2020-09-30T21:00:09Z", "myNumber": 4794261}

Sin especificar los conversores, la salida JSON en modo relajado se asemeja al siguiente texto:

{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "createdAt": {"$date": "2020-09-30T21:00:09Z"}, "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: