[Resolvido] Como retirar um array? (Json.parse)


#1

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  "
    }
]

Até ai tudo bem. Quando coloco para o boot printar em tela a variável: {{response}} ele me retorna:
[{"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!!


[Resolvido] Manipulação de dados - API
#2

Consegui assim:

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

Valeu!


#3

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


#4

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


#5

@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 :smiley:


#6

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.


#7

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


#8

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.


#9

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


#10

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.


#11

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…