Como retirar um array? (Json.parse)


Olá!
Estou tentando exercitar os conhecimentos adquiridos no Bootcamp POA. (Aliás, ótimo evento)
Pois bem, meu objetivo é criar um bot de consulta de previsão do tempo. Similar ao exemplo do “Darksky” porém usando a API do clima tempo.

http://apiadvisor.climatempo.com.br/api/v1/locale/city?name={{cidade}}&token=XXXXXXXXXXXXX
Atualmente necessito pesquisar por uma string “name” que me retorna o seguinte:

[
{
"id": 5575,
"name": "Canoas",
"state": "RS",
"country": "BR "
}
]

O que eu necessito desta consulta é apenas o ID.
Então tentei: {{response@id}} mas ele me retorna vazio quando faço desta maneira.

Pesquisando aqui no fórum entendi que é necessário retirar o array afim do builder pode consumir esta informação.
Este script é realizando utilizando um JSON.parse() e um JSON.stringify()?

Já sei como inserir o script, porém não sou programador, logo o básico de javascript pra mim é avançado. hehe
Estava tentando seguir esta linha, mas não tive sucesso.

function run(response) {
var idcidade = JSON.parse(response);
return idcidade
}

Existe algum modelo desta conversão que poderiam compartilhar para ajudar neste meu caso?
Conseguir somente o ID da cidade.

Obrigado!!


11 comentários

Consegui assim:


function run(response) {
var idcidade = JSON.parse(response)[0].id;
return idcidade
}

Valeu!

@Luis_Augusto_Vanzin


Que bom que funcionou…


Da forma abaixo, acredito que fica mais fácil de entender o código.


function run(response) {

response = JSON.parse(response);

return response.id;

}


Dessa forma, você faz o parse do JSON para objetos Javascript.Como você já definiu a variável response no escopo da função, não é necessário declarar novamente a variável. Com isso, você terá uma estrutura de objetos e pode acessar a propriedade response.id. Caso quisesse o nome, ficaria response.name e assim por diante.

Fala Leonardo, uma duvida , caso queira converter todas as variáveis de uma só vez, ou um arquivo json inteiro, qual seria o jeito?

@Ricardo_Anklan, a função JSON.parse(parâmetro) já faz isso pra você. Basta você passar o retorno da sua API como parâmetro da função JSON.parse() e ele já retornará todas as chaves e valores pra você manipular no seu chatbot. Ele já converte tudo de uma vez. Aí depende de você quais chaves e valores você quer usar. Não é uma obrigação você usar todas 😃

Só fique atento para um bug do PARSE que acontece quando o JSON vem com aspas duplas " dentro de um campo, tipo:


{
"campo":"Valor com aspas " dentro do conteúdo"
}

Vai ter que limpar o conteúdo antes de fazer o parse.

Pra isso, faca um string.replace

Peguei isso na API do Google Custom Search que trazia " quando tinha menção a unidade de medida Polegadas no conteúdo.

@Jhoni_Desb, não sabia disso. Achei que o parse cuidava se caso viesse aspas duplas no retorno da informação. Obrigado pela dica 😃

Então, eu fiquei de cara com isso, até por que faria mais sentido o PARSE considerar o valor do campo até a última aspas.

Ou ser mais inteligente e considerar tudo o que tem depois dos : até a vírgula, se houver.

Mas não, ele começa a ler o conteúdo a partir da primeira e ao encontrar a próxima aspas, ele termina a leitura do campo e parte para o próximo. Aí ta feita a cagada.

Cara, eu não manjo muito de JavaScript, não sei se existe outra solução, mas eu troquei os caracteres " por Pol.

@Jhoni_Desb, se quiser, me mostra como vem o seu JSON pra ver se existe uma solução mais viável. Já tenho uma certa experiência com JS. É bom também pra saber a lidar com esse tipo de situação. O que ele poderia fazer é entender que se houvesse uma aspas dupla dentro de outra, ele transformaria a outra em aspas simples, já que é possível colocar aspas simples dentro de duplas e vice-versa.

Leonardo, eu acho que não tem como mexer na formatação do JSON do Google.

Olha um exemplo do resultado:


{
"kind": "customsearch#search",
"url": {
"type": "application/json",
"template": "https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&lr={language?}&safe={safe?}&cx={cx?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&c2coff={disableCnTwTranslation?}&hq={hq?}&hl={hl?}&siteSearch={siteSearch?}&siteSearchFilter={siteSearchFilter?}&exactTerms={exactTerms?}&excludeTerms={excludeTerms?}&linkSite={linkSite?}&orTerms={orTerms?}&relatedSite={relatedSite?}&dateRestrict={dateRestrict?}&lowRange={lowRange?}&highRange={highRange?}&searchType={searchType}&fileType={fileType?}&rights={rights?}&imgSize={imgSize?}&imgType={imgType?}&imgColorType={imgColorType?}&imgDominantColor={imgDominantColor?}&alt=json"
},
"queries": {
"request": [
{
"title": "Google Custom Search - faca de churrasco",
"totalResults": "84200000",
"searchTerms": "faca de churrasco",
"count": 10,
"startIndex": 1,
"inputEncoding": "utf8",
"outputEncoding": "utf8",
"safe": "off",
"cx": "010049665617185726535:dpkiefl_kzu",
"searchType": "image"
}
],
"nextPage": [
{
"title": "Google Custom Search - faca de churrasco",
"totalResults": "84200000",
"searchTerms": "faca de churrasco",
"count": 10,
"startIndex": 11,
"inputEncoding": "utf8",
"outputEncoding": "utf8",
"safe": "off",
"cx": "010049665617185726535:dpkiefl_kzu",
"searchType": "image"
}
]
},
"context": {
"title": "Google"
},
"searchInformation": {
"searchTime": 0.557068,
"formattedSearchTime": "0,56",
"totalResults": "84200000",
"formattedTotalResults": "84.200.000"
},
"items": [
{
"kind": "customsearch#result",
"title": "Faca para Churrasco Zakharov Picanheira Plus 10" com Cabo de ...",
"htmlTitle": "\u003cb\u003eFaca\u003c/b\u003e para \u003cb\u003eChurrasco\u003c/b\u003e Zakharov Picanheira Plus 10" com Cabo de ...",
"link": "https://w1.ezcdn.com.br/zakharov/fotos/zoom/457fz1/faca-churrasco-e-cozinha-cabo-de-madeira-zakharov-picanheira-plus-10.jpg",
"displayLink": "www.zakharov.com.br",
"snippet": "Faca para Churrasco Zakharov Picanheira Plus 10" com Cabo de ...",
"htmlSnippet": "\u003cb\u003eFaca\u003c/b\u003e para \u003cb\u003eChurrasco\u003c/b\u003e Zakharov Picanheira Plus 10" com Cabo de ...",
"mime": "image/jpeg",
"image": {
"contextLink": "https://www.zakharov.com.br/faca-churrasco-e-cozinha-cabo-de-madeira-zakharov-picanheira-plus-10-p457/",
"height": 768,
"width": 1024,
"byteSize": 79558,
"thumbnailLink": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSqLRyrozkNERwu86MqHw5L3QMvQpEKPeUTG82P84vNcA1BMMAr4uogiErE",
"thumbnailHeight": 113,
"thumbnailWidth": 150
}
},
...

Perceba o trecho com o conteúdo "title": "Faca para Churrasco Zakharov Picanheira Plus 10" com Cabo de ...",

Isso faz o PARSE bugar todo e não consigo nenhum retorno útil.

Jhoni, essa “” deveria escapar as quotes ("), mas por algum motivo não está fazendo isso. Vi algumas pessoas usando o replace method da classe String como você fez. Mas é curioso não estar escapando…

Reputação 5

Pessoal apenas para acrescentar eu recupero um valor bem parecido com o seu, @Luis_Augusto_Vanzin e eu trato assim:



function run(inputVariable1, inputVariable2) {

function splitMulti(str, tokens) {
var tempChar = tokens[0];
for (var i = 1; i < tokens.length; i++) {
str = str.split(tokens[i]).join(tempChar);
}
str = str.split(tempChar);
return str;
}

var text = '{{respostaGetGoogleSheets@values}}'
var textNew = []
textNew = splitMulti(text, ['[["', '"],["', '"]]'])

var textPes = inputVariable1
var Existe = false
for (var i = 0; i < textNew.length; i++) {

if (textPes == textNew[i]) {
Existe = true
}
}
return Existe
}


Mas neste caso eu preciso validar se o usuário já existe no meu bd salvo no Google Sheets.

Comente