Visão geral
Neste guia, você pode aprender 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 oferece suporte a 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 recurso JSON e BSON.
Formatos Extended JSON
O MongoDB Extended JSON recurso 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 | Também conhecido como o formato canônico, essa representação do JSON evita a perda de informações do tipo de BSON. |
Modo relaxado | Representação JSON que descreve documentos BSON com algum tipo de perda de informação. |
Shell | Obsoleto. Representação JSON que corresponde à sintaxe usada no MongoDB shell. |
Strict | Obsoleto. Essa representação é o formato legado que está totalmente em conformidade com o JSON RFC que permite a qualquer analisador JSON ler as informações de tipos. |
Observação
O driver analisa o tipo de JSON estendido $uuid de uma string para dados binários com subtipo 4 (BSON_SUBTYPE_UUID). Para obter mais informações sobre análise do campo $uuid, 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ção JSON 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 BSON
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 gravar 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 aprender 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: