Parssear retorno de JSON com Arrays vindo como String

Olá pessoal. Faço uma requisição em minha API cujo o retorno é um JSON no seguinte formato:

{
“codigo_associado”: “xxxxxxx”,
“codigo_associado_beneficiario”: “xxxxxxx”,
“nome”: “Name”,
“sexo”: “F”,
“categoria_cnh”: 0,
“data_vencimento_habilitacao”: null,
“cpf”: “xxxxxxx”,
“veiculos”: [
{
“codigo_veiculo”: “xxxxxxx”,
“placa”: “xxxxxxx”,
“chassi”: “xxxxxxx”,
“valor_fixo”: 0,
“codigo_situacao”: 0,
“situacao”: “SUBSTITUIDO”,
“codigo_modelo”: “xxxxxxx”,
“descricao_modelo”: “xxxxxxx”,
“valor_fipe”: “xxxxxxx”
},
{
“codigo_veiculo”: “xxxxxxx”,
“placa”: “xxxxxxx”,
“chassi”: “xxxxxxx”,
“valor_fixo”: 0,
“codigo_situacao”: 0,
“situacao”: “SUBSTITUIDO”,
“codigo_modelo”: “xxxxxxx”,
“descricao_modelo”: “xxxxxxx”,
“valor_fipe”: “xxxxxxx”
}
],
“spcSerasa”: “xxxxxxx”
}

Seu eu imprimir a resposta no builder {{response}}, obtenho a resposta da API no seguinte formato:

Array ( [codigo_associado] => xxxxxxx [codigo_associado_beneficiario] => xxxxxxx [nome] => Name [sexo] => F [categoria_cnh] => 0 [data_vencimento_habilitacao] => [cpf] => xxxxxxx [veiculos] => Array ( [0] => Array ( [codigo_veiculo] => xxxxxxx [placa] => xxxxxxx [chassi] => xxxxxxx [valor_fixo] => 0.00 [codigo_situacao] => 0 [situacao] => SUBSTITUIDO [codigo_modelo] => xxxxxxx [descricao_modelo] => xxxxxxx [valor_fipe] => xxxxxxx) [1] => Array ( [codigo_veiculo] => xxxxxxx [placa] => xxxxxxx [chassi] => xxxxxxx [valor_fixo] => 0.00 [codigo_situacao] => 0 [situacao] => SUBSTITUIDO [codigo_modelo] => xxxxxxx [descricao_modelo] => xxxxxxx [valor_fipe] => xxxxxxx ) ) [spcSerasa] => xxxxxxx )

Aparentemente o blip converte o retorno da API para uma string. Estou com dificuldades para “parssear” essa string e acessar os valores da resposta da API que vem exatamente nesse formato mostrado acima.

Já tentei fazer um script com a seguinte instrução:

const parssedResponse = JSON.parse(response);

Mas não funcionou. Obtenho o seguinte erro:

Unexpected token A in JSON at position 0 at JSON.parse

Algum de vcs saberia me dá uma luz? Muito obrigado antecipadamente.

@Pedro_Matos, será que você consegue me mandar exatamente o conteúdo de {{response}}. E não se esqueça de remover os valores sensíveis :wink:

1 Curtida

Oi @fadoaglauss ,

Segue o conteúdo de {{response}}:

Array ( [codigo_associado] => xxxxxxx [codigo_associado_beneficiario] => xxxxxxx [nome] => xxxxxxx [sexo] => F [data_nascimento] => xxxxxxx [rg] => xxxxxxx [orgao_expedidor_rg] => [data_expedicao_rg] => [cnh] => [categoria_cnh] => 0 [data_vencimento_habilitacao] => [cpf] => xxxxxxx [telefone_fixo] => xxxxxxx [telefone_celular] => xxxxxxx [telefone_celular_aux] => () [telefone_comercial] => () [email] => xxxxxxx [email_auxiliar] => [cep] => xxxxxxx [logradouro] => xxxxxxx [numero] => xxxxxxx [complemento] => [bairro] => xxxxxxx [cidade] => xxxxxxx [estado] => xxxxxxx [codigo_regional] => 1 [codigo_cooperativa] => 1 [codigo_situacao] => 1 [descricao_situacao] => xxxxxxx [dia_vencimento] => 10 [codigo_tipo_cobranca_recorrente] => 1 [descricao_tipo_cobranca_recorrente] => BOLETO / CARNÊ [codigo_externo] => xxxxxxx [data_cadastro] => xxxxxxx [veiculos] => Array ( [0] => Array ( [codigo_veiculo] => xxxxxxx [placa] => xxxxxxx [chassi] => xxxxxxx [valor_fixo] => 0.00 [codigo_situacao] => 9 [situacao] => SUBSTITUIDO [codigo_modelo] => xxxxxxx [descricao_modelo] => xxxxxxx [valor_fipe] => xxxxxxx [codigo_veiculo_indicador] => [placa_veiculo_indicador] => [codigo_associado_indicador] => [cpf_associado_indicador] => [nome_associado_indicador] => ) [1] => Array ( [codigo_veiculo] => xxxxxxx [placa] => xxxxxxx [chassi] => xxxxxxx [valor_fixo] => 0.00 [codigo_situacao] => 1 [situacao] => ATIVO [codigo_modelo] => xxxxxxx [descricao_modelo] => xxxxxxx [valor_fipe] => xxxxxxx [codigo_veiculo_indicador] => [placa_veiculo_indicador] => [codigo_associado_indicador] => [cpf_associado_indicador] => [nome_associado_indicador] => ) ) [spcSerasa] => xxxxxxx )

Troquei a maioria das informações por xxxxxxx. O campo veículos é dinâmico. Cada usuário pode ter nenhum, um ou mais de um veículo.

Confirma pra mim, por favor: a sua requisição retorna um Array mesmo ou um .json?

@fadoaglauss minha requisição retorna um .json. Dentro do campo veiculos é retornado um array de objetos. Mas, por algum motivo, dentro do blip toda a resposta da requisição está vindo nesse formato de array. :confused:

1 Curtida

@Pedro_Lucas vê se você consegue me ajudar, porque nunca vi algo do tipo :confused:

1 Curtida

Oi me chará tudo bom? o que eu faço quando dá uns trem desse é usar split pra fazer virar lista denovo hahaah, mas precisava entender como você quer fazer e como quer usar pra poder da uma ideia de script pra tratar esse retorno :slight_smile:

1 Curtida

@Pedro_Lucas tudo bem chará!! E vc? Na verdade eu preciso do objeto JSON retornado pela API para usar as informações dele ao longo do fluxo do meu bot. Chegamos a fazer um script hoje para isso. Ele roda perfeitamente fora do blip. Mas ao usar o script no blip temos o seguinte erro:

Segue o script criado:

// All input variables needs to be passed as function param;
// Objects received as param needs to be parsed. Ex.: JSON.parse(inputVariable1);
// Objects returned needs to be stringfied. Ex.: JSON.stringify(inputVariable1);

function run(data) {

String.prototype.replaceAt = function(index, replacement) {
    return (
        this.substr(0, index) +
        replacement +
        this.substr(index + replacement.length)
    );
};

data = data.normalize("NFD").replace(/[\u0300-\u036f]/g, "");

const tst = (d, i, char) => {
    n = 0;
    while (i < d.length) {
        if (d[i] === "(") n++;
        else if (d[i] === ")") {
            if (n === 0) {
                d = d.replaceAt(i, char);
                return d;
            }
            n--;
        }
        i++;
    }
};

let ind = [];
let num = 0;

data = data.replace(/\[[\w_]+\]\s+=>\s+Array\s+\(/g, (match, $1) => {
    ind.push($1 - num);
    num -= match.length;
    return match.replace(/\[\]/g, "").replace(/\s=>\sArray\s\(/g, " => {");
});

for (i = 0; i < ind.length; ++i) data = tst(data, ind[i], "}");

ind = [];
num = 0;

data = data.replace(/Array\s\(/g, (match, $1) => {
    ind.push($1 - num);
    num -= 7;
    return "{";
});

for (i = 0; i < ind.length; ++i) data = tst(data, ind[i], "}");

// Preenche valores indefinidos.
data = data.replace(/=>\s+(?=[^A-Za-z0-9{\(])/g, "=> null ");
//console.log('NULL: ', data)

// Adiciona vírgulas.
data = data.replace(
    /[\w-.@\(\)]+\s*(?=[\[])/g,
    (match, p1, p2, p3, offset, string) => {
        return match + ", ";
    }
);
//console.log('(0): ', data)

// Retira colchetes.
data = data.replace(/[\[\]]/g, "");
//console.log('(1): ', data)

// Adiciona aspas.
data = data.replace(
    /(?<==>\s+)(([\w\s-.@\/\(\)]+)|(\(\d*\)[\d-]*))/g,
    (match, p1, p2, p3, offset, string) => {
        return '"' + match.trim() + '"';
    }
);
data = data.replace(
    /(([\w\s-.@\/\(\)]+)|(\(\d*\)[\d-]*))(?=\s+=>)/g,
    (match, p1, p2, p3, offset, string) => {
        return '"' + match.trim() + '"';
    }
);
//console.log('(2): ', data)

// Adiciona dois pontos nas keys.
data = data.replace(/=>/g, ":");
//console.log('(4): ', data)

// Adiciona vírgula após chaves.
data = data.replace(/}(?![\s*\}]|\s*$)/g, "}, ");
//console.log('(5): ', data)


return data; //Return value will be saved as "Return value variable" field name

}

2 Curtidas

Oi @Pedro_Matos, tudo bom?

A variável na print “resbuscarassociado” é o retorno do response da sua API?

Se sim, sua API não está retornando um Json.

Tente alterar o retorno serializando o objeto para json. Para fins de teste, tente forçar a serialização.

1 Curtida

Oi @Arthur_Batista . Obrigado pelo retorno.

Sim. A variável “resBuscarAssociado” é o retorno do response da minha API. A API foi desenvolvida por uma empresa terceira. Segue abaixo a requisição na API via Blip:

Se eu fizer a mesma requisição, no mesmo endpoint, com os mesmos parâmetros dentro do Insomnia, obtenho o seguinte JSON no preview:

No Raw data obtenho:

Segue a documentação da minha API:

Fiz outro teste no Insomnia e constatei que se eu não passar no header da minha requisição o Content-Type: application/json é retornado a mesma resposta em formato de texto/array como descrito nos comentários anteriores.

Será que o problema estaria no header? O curioso é que o estou enviando os dois parâmetros de header normalmente. Tem alguma outra configuração que tenho que realizar na requisição http no Blip? Se não, existe a possibilidade de criar um script para conversão dos dados que não ultrapasse o número de operações máximas de um script no Blip?

Obrigado.

1 Curtida

Fala @Pedro_Matos!

Vi sua print e notei que você está fazendo uma requisição GET com o Content-Type no header.

Por padrão, o Content-Type não é enviado com requisições GET. Essa propriedade é utilizada somente quando temos um body na requisição, como no POST e PUT.

O seu endpoint deve ser alterado para POST, e no Blip fazer a mesma alteração após a mudança.

3 Curtidas

Oi @Arthur_Batista . Entendi. Não é possível alterarmos nossa API de consulta de dados. Ela é atualmente utilizada por diversas outras aplicações. Fizemos uma API intermediário para resolver o problema.

Acho que seria interessante em uma possível atualização do Blip, no método GET, não bloquear o Content-Type ou então permitir que o usuário envie um body nas requisições (isso daria mais liberdade para nós usuários da plataforma).

De qualquer forma, muito obrigado pela atenção e ajuda. As respostas de vocês foram muito rápidas e importantes na solução do problema. Abraços. :slight_smile:

2 Curtidas

Bom demais Pedro!

Coloca no https://ideas.blip.ai/ que iremos dar UP.

Um abraço.

2 Curtidas