Categorias:

Funções de dados semiestruturados e estruturados (Análise)

TRY_PARSE_JSON

Uma versão especial de PARSE_JSON que retorna um valor NULL se ocorrer um erro durante a análise.

Sintaxe

TRY_PARSE_JSON( <expr> )
Copy

Argumentos

expr

Uma expressão do tipo cadeia de caracteres (por exemplo, VARCHAR).

Retornos

O valor retornado é do tipo VARIANT e contém um documento JSON.

Notas de uso

  • Esta função oferece suporte a uma expressão de entrada com um tamanho máximo de 8 MB comprimido.

  • Se a entrada for NULL, a saída também será NULL. Entretanto, se a cadeia de caracteres de entrada for 'null', ela é interpretada como um valor JSON nulo para que o resultado não seja SQL NULL, mas um valor VARIANT válido contendo null.

  • Ao analisar números decimais, esta função tenta preservar a exatidão da representação, tratando 123,45 como NUMBER(5,2), e não como DOUBLE. Entretanto, números que usam notação científica (por exemplo, 1,2345e+02) ou números que não podem ser armazenados como decimais de ponto fixo devido às limitações de intervalo ou escala são armazenados como DOUBLE. Como JSON não representa valores como TIMESTAMP, DATE, TIME ou BINARY nativamente, eles têm que ser representados como cadeias de caracteres.

  • Em JSON, um objeto (também chamado de “dicionário” ou “hash”) é um conjunto desordenado de pares chave-valor. TO_JSON e TRY_PARSE_JSON são funções (quase) inversas ou recíprocas.

    A função TRY_PARSE_JSON pega uma cadeia de caracteres como entrada e retorna uma variante compatível com JSON. A função TO_JSON pega uma variante compatível com JSON e retorna uma cadeia de caracteres. O seguinte é (conceitualmente) verdadeiro se X for uma cadeia de caracteres contendo JSON válido:

    X = TO_JSON(TRY_PARSE_JSON(X));

    Por exemplo, o seguinte é (conceitualmente) verdadeiro:

    '{"pi":3.14,"e":2.71}' = TO_JSON(TRY_PARSE_JSON('{"pi":3.14,"e":2.71}'))

    No entanto, as funções não são perfeitamente recíprocas por duas razões:

    • A ordem dos pares chave-valor na cadeia de caracteres produzida por TO_JSON não é previsível.

    • A cadeia de caracteres produzida por TO_JSON pode ter menos espaço em branco do que a cadeia de caracteres passada para TRY_PARSE_JSON.

    Os seguintes são JSON equivalentes, mas não cadeias de caracteres equivalentes:

    • {"pi": 3.14, "e": 2.71}

    • {"e":2.71,"pi":3.14}

Exemplos

Isto mostra um exemplo de armazenamento de diferentes tipos de dados em uma coluna VARIANT chamando TRY_PARSE_JSON para analisar cadeias de caracteres de caracteres que contêm valores que podem ser analisados como JSON:

Criar e preencher uma tabela.

CREATE OR REPLACE TEMPORARY TABLE vartab (ID INTEGER, v VARCHAR);

INSERT INTO vartab (id, v) VALUES
  (1, '[-1, 12, 289, 2188, FALSE,]'),
  (2, '{ "x" : "abc", "y" : FALSE, "z": 10} '),
  (3, '{ "bad" : "json", "missing" : TRUE, "close_brace": 10 ');
Copy

Consultar os dados, usando TRY_PARSE_JSON. Observe que o valor para a terceira linha é NULL. Se a consulta usasse PARSE_JSON em vez de TRY_PARSE_JSON, ela falharia.

SELECT ID, TRY_PARSE_JSON(v)
  FROM vartab
  ORDER BY ID;
Copy
+----+-------------------+
| ID | TRY_PARSE_JSON(V) |
|----+-------------------|
|  1 | [                 |
|    |   -1,             |
|    |   12,             |
|    |   289,            |
|    |   2188,           |
|    |   false,          |
|    |   undefined       |
|    | ]                 |
|  2 | {                 |
|    |   "x": "abc",     |
|    |   "y": false,     |
|    |   "z": 10         |
|    | }                 |
|  3 | NULL              |
+----+-------------------+