Visão geral
Neste guia, você verá como usar o formato Extended JSON no driver C.
JSON é um formato de dados que representa os valores de objetos, arrays, números, strings, booleans e nulos. Este formato suporta apenas um subconjunto de tipos de dados BSON, que é o formato que o MongoDB utiliza para armazenar dados. O formato Extended JSON aceita mais tipos de BSON, definindo um conjunto reservado de chaves prefixadas com "$" para representar informações de tipos de campo que correspondem diretamente a cada tipo em BSON.
Para obter mais informações sobre a diferença entre esses formatos, consulte o recursoJSON e BSON .
Formatos Extended JSON
O MongoDB Extended JSON apresenta diferentes formatos de string para representar dados BSON. Cada um dos formatos está em conformidade com o JSON RFC e atende a casos de uso específicos.
A tabela a seguir descreve cada formato:
Nome | Descrição |
|---|---|
Extended | 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 relaxado | 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 | Deprecated. 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. The legacy API uses this format. |
Strict | 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. |
Observação
O driver analisa o $uuid tipo de JSON estendido de uma string para dados binários com subtipo 4 BSON_SUBTYPE_UUID(). Para obter mais informações sobre $uuid análise do campo, consulte as regras especiais para analisar campos $uuid .
Para obter informações mais detalhadas sobre esses formatos, consulte os seguintes recursos:
JSON RFC documentação oficial
MongoDB Extended JSON Entrada manual de servidor
BSON_SUBTYPE_UUID Documentação da API
EspecificaçãoJSON estendida no GitHub
Exemplos de JSON estendido
Os exemplos abaixo mostram um documento contendo um campo de ObjectId, data e número longo representado em cada formato Extended JSON. Clique na aba correspondente ao formato do exemplo que deseja 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" } }
Ler Extended JSON
Usar funções JSON
Você pode ler uma string de JSON estendida em um documento BSON chamando a função bson_new_from_json(). Esta função analisa a string JSON estendida e retorna uma estrutura bson_t contendo os dados.
O exemplo a seguir mostra como você pode ler uma string de exemplo de Extended JSON em um documento bson_t :
/* Read Extended JSON string to BSON */ const char *ejson_str = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\"}," "\"myNumber\": {\"$numberLong\": \"4794261\" }}"; bson_error_t error; bson_t *doc = bson_new_from_json ((const uint8_t *)ejson_str, -1, &error);
Para obter mais informações, consulte a documentação da API bson_new_from_json() e bson_as_canonical_extended_json().
Use o leitor JSON BSON
Você também pode analisar strings de Extended JSON usando o tipo bson_json_reader_t, que fornece uma interface de streaming para converter de JSON em BSON. Isso é particularmente útil ao processar vários documentos JSON ou quando você precisa de mais controle sobre o processo de análise.
O seguinte exemplo de código mostra como usar o bson_json_reader_t para converter uma string de Extended JSON em um documento BSON :
const char *ejson_str = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\"}," "\"myNumber\": {\"$numberLong\": \"4794261\" }}"; bson_json_reader_t *reader; bson_error_t error; bson_t doc = BSON_INITIALIZER; int ret; reader = bson_json_data_reader_new (false, 0); bson_json_data_reader_ingest (reader, (const uint8_t *)ejson_str, strlen (ejson_str)); ret = bson_json_reader_read (reader, &doc, &error); if (ret > 0) { bson_iter_t iter; if (bson_iter_init (&iter, &doc)) { while (bson_iter_next (&iter)) { const char *key = bson_iter_key (&iter); if (strcmp (key, "_id") == 0 && BSON_ITER_HOLDS_OID (&iter)) { const bson_oid_t *oid = bson_iter_oid (&iter); char oid_str[25]; bson_oid_to_string (oid, oid_str); printf ("%s is type: ObjectId\n", oid_str); } if (strcmp (key, "myNumber") == 0 && BSON_ITER_HOLDS_INT64 (&iter)) { int64_t number = bson_iter_int64 (&iter); printf ("%ld is type: int64_t\n", (long)number); } } } } else if (ret < 0) { printf ("Error: %s\n", error.message); } bson_json_reader_destroy (reader); bson_destroy (&doc);
507f1f77bcf86cd799439011 is type: ObjectId 4794261 is type: int64_t
Para obter mais informações, consulte a seguinte documentação da API:
Escrever JSON estendido
Você pode escrever um documento BSON como uma string de JSON estendida chamando a função bson_as_json_with_opts(). Esta função converte um documento bson_t em uma string de Extended JSON com opções para especificar o formato de saída.
O exemplo a seguir mostra como criar um documento BSON e produzi-lo como JSON estendido em formato relaxado:
bson_t *doc; bson_oid_t oid; bson_json_opts_t *opts; char *json_str; // Create a BSON document doc = bson_new (); bson_oid_init_from_string (&oid, "507f1f77bcf86cd799439012"); bson_append_oid (doc, "_id", -1, &oid); bson_append_int32 (doc, "myNumber", -1, 11223344); // Configure JSON output options for Relaxed mode opts = bson_json_opts_new (BSON_JSON_MODE_RELAXED, BSON_MAX_LEN_UNLIMITED); // Convert to Extended JSON json_str = bson_as_json_with_opts (doc, NULL, opts); printf ("%s\n", json_str); // Cleanup bson_free (json_str); bson_json_opts_destroy (opts); bson_destroy (doc);
{ "_id" : { "$oid" : "507f1f77bcf86cd799439012" }, "myNumber" : 11223344 }
Para obter mais informações, consulte a documentação da API bson_as_json_with_opts().
Documentação da API
Para saber mais sobre as funções e tipos que você pode usar para trabalhar com dados de JSON estendido, consulte a seguinte documentação da API: