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, os números que utilizam notação científica (por exemplo, 1.2345e+02) ou números que não podem ser armazenados como decimais de pontos fixos devido a limitações de faixa 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 tivesse usado PARSE_JSON em vez de TRY_PARSE_JSON, a consulta teria falhado.

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