Overview
En esta guía, puede aprender a utilizar el formato JSON extendido en el controlador Java de MongoDB.
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 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 tipos BSON
Para obtener más información sobre la diferencia entre estos formatos, consulta nuestro Artículo sobre JSON y BSON.
Formatos JSON extendidos
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 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 extendidos
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 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 Fundamentos en documento.
Uso de la librería BSON
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 cadena JSON extendida 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.
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, generamos 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}
Uso de la librería BSON
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:
Conversión de tipo BSON personalizada
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: