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 | Deprecated. This representation is the legacy format that fully conforms to the JSON RFC, which allows any JSON parser to read the type information. |
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);
Para obter mais informações, consulte a seguinte documentação da API:
Aviso
Validar entrada não confiável antes de converter JSON em BSON
Se você converter uma string JSON em BSON e utilizar o BSON resultante em uma query, atualização ou comando, um invasor poderá injetar operadores ou valores de campo inesperados que alteram o significado da operação. Esse risco é maior quando o JSON se origina de um usuário, de uma solicitação de API ou de outra fonte não confiável.
To learn more about validating input before conversion, see Validate Untrusted Input Before Converting JSON to BSON.
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);
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: