Respondido

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.

icon

Melhor resposta por Pedro_Matos 23 July 2021, 14:32

Veja o original

16 comentários

@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 😉

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. 😕

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

Reputação 7
Crachá +2

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 🙂

@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

}

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.

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.

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.

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. 🙂

Bom demais Pedro!


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


Um abraço.

Reputação 7
Crachá +1

Fala Pedro, tudo certo ? Eu montei um script aqui com base nessas informações que você nos passou e cheguei em um resultado ate que satisfatório, poderia testar ?


            function run(bodyCliente) {


const textHml = bodyCliente.concat().replace(/(\r\n|\n|\r)/gm, "");

const result = textHml.split(']').join('').split('[').filter((e) => e !== 'Array( ').map((e) => e.split('=>'))

let json = {};

for (var i = 0; i < result.length; i++) {

for (let j = 0; j < result[i].length; j++) {

json[result[i][0].trim()] = result[i][1].trim();
}
}


return json;
}
Reputação 7

@Pedro_Matos vem ver isso 👀

Show demais. Por alguns outros motivos decidimos criar uma API intermediária que já recebia os dados em JSON. Mas, muito obrigado pela contribuição da solução. Tenha certeza que pode ajudar outras pessoas no futuro. 😉

Reputação 5
Crachá +1

Para contribuir com a comunidade, tive o mesmo problema, creio que seja a mesma API. (Loading...) comparando o retorno, é exatamente igual.

E observação, usei o método POST passando o content-type: application/json.


🦠


O BLiP utiliza o padrão “Charset UTF-8” ao efetuar a requisição pois é o padrão de codificação mais utilizado. Esse valor é atribuído sempre em todas as requisições.


Ou seja, quando dispara uma requisição vai junto o valor do charset ‘invisível’. Provavelmente essa API não é preparada para receber esse padrão.

E por tabela, qualquer informação a mais ou a menos que a api não espera ela retorna nesse formato string.


A solução por aqui foi fazer uma API intermediária.

Comente