produto.json
{
"idProduto": 44235,
"cores": ["azul", "verde"]
}
String
Number
Boolean
null
[
{
"nome": "JavaScript - The Good Parts",
"autores": ["Douglas Crockford"],
"ano": 2005
},
{
"nome": "Node.js in Action",
"autores": ["Mike Cantelon", "Mark Harter"],
"ano": 2014
}
]
<livros>
<livro nome="JavaScript - The Good Parts" ano="2005">
<autores>
<autor>Douglas Crockford</autor>
</autores>
</livro>
<livro nome="Node.js in Action" ano="2014">
<autores>
<autor>Mike Cantelon</autor>
<autor>Mark Harter</autor>
</autores>
</livro>
</livros>
window
possui o objeto JSON
que contém métodos de conversão
do formato JSON entre string e objetos JavaScript
JSON.stringify({ nome: 'Flavio', sobrenome: 'Coutinho' }); // JSON.stringify
// retorna '{"nome":"Flavio","sobrenome":"Coutinho"}'
let banco = JSON.parse('{"nome":"Itaú","codigo":"341"}'); // JSON.parse
console.log(banco.nome);
// imprime Itaú
JSON.stringify({}) // '{}'
JSON.stringify(true) // 'true'
JSON.stringify('foo') // '"foo"'
JSON.stringify([1, 'false', false]) // '[1,"false",false]'
JSON.stringify({ x: 5 }) // '{"x":5}'
JSON.stringify({ x: 5, y: 6 }) // '{"x":5,"y":6}' ou '{"y":6,"x":5}'
JSON.stringify({ uno: 1, dos: 2 }, null, 4); // <-- parâmetro spacer
// saída formatada 🌟:
// '{
// "uno": 1,
// "dos": 2
// }'
JSON.parse('{}') // {}
JSON.parse('true') // true
JSON.parse('"foo"') // "foo"
JSON.parse('[1, 5, "false"]') // [1, 5, "false"]
JSON.parse('null') // null
JSON.parse('{"x": 25,"y":"inválido"}') // {x: 25, y: 'inválido'}
localStorage
sessionStorage
localStorage
, salva os dados "para sempre"sessionStorage
, salva apenas "durante a sessão"localStorage
e sessionStorage
localStorage.setItem('personagem', 'Jake');
localStorage.setItem('quest', 'Salvar a Jujuba');
let nome = localStorage.getItem('personagem'); // retorna "Jake"
let objetivo = localStorage.getItem('quest'); // retorna "Salvar a Jujuba"
// ...
botaoMenuEl.addEventListener('click', function() {
let menuEl = document.querySelector('#menu'),
isExpandido = menuEl.classList.toggle('expandido');
// isExpandido = true ou false
localStorage.setItem('menu-esta-expandido', isExpandido);
});
let devoExpandirMenu = localStorage.getItem('menu-esta-expandido');
if (devoExpandirMenu === 'true') { // lembre-se: tudo é salvo como String
let menuEl = document.querySelector('#menu');
menuEl.classList.add('expandido');
}
localStorage.setItem('chave', 'valor');
localStorage.getItem('chave');
localStorage.removeItem('chave');
localStorage
, porém o navegador armazena
as informações apenas enquanto o usuário está “em uma sessão”
sessionStorage
são os mesmos do localStorage
const jogo = { fase: 4, vidas: 5, jogador: 'Ariosvaldo' };
localStorage.setItem('estado-do-jogo', jogo);
console.log(localStorage.getItem('estado-do-jogo'));
// Saída no console: "[object Object]"
Object.prototype.toString
que é um
método que sempre retorna "[object Object]"
—
localStorage.setItem('estado-do-jogo', JSON.stringify(jogo));
// Salvou: {"fase":4,"vidas":5,"jogador":"Ariosvaldo"}"
const jogo = localStorage.getItem('estado-do-jogo');
jogo = JSON.parse(jogo);
XMLHttpRequest
)XMLHttpRequest
(antigão)XMLHttpRequest
. Exemplo do Twitter:
let requisicao = new XMLHttpRequest();
requisicao.onreadystatechange = callbackMaisTweets;
requisicao.responseType = 'json';
requisicao.open('GET', '/tweets/pagina/5');
requisicao.send();
onreadystatechange
) é invocada a cada mudança
de estado da requisição (veja nos próximos 2 slides)function callbackMaisTweets() {
if (requisicao.readyState === 4) { // 4: DONE (resp. recebida)
if (requisicao.status === 200) { // 200: código Ok do HTTP
// a resposta chegou e foi um arquivo
// .json com um array de tweets:
let novosTweets = requisicao.response.arrayComNovosTweets;
novosTweets.forEach(colocaTweetNaPagina);
} else {
console.log('Erro ao carregar mais tweets. Código HTTP: '
+ requisicao.status);
}
}
}
XMLHttpRequest
{
"quantidade": 20,
"arrayComNovosTweets": [
{
"autor": "Sensacionalista",
"texto": "Grupo de feministas pró-Bolsonaro
cria novo grupo: Vegetarianos
pró carne mal passada",
"curtidas": 2
} /* mais 19 tweets aqui... */
]
}
XMLHttpRequest
0 UNSENT
~ open()
ainda não foi invocado
1 OPENED
~ send()
ainda não foi invocado
2 HEADERS_RECEIVED
~ send()
foi invocado e os cabeçalhos da resposta
já estão disponíveis (chegaram)
3 LOADING
~ fazendo download da resposta
4 DONE
~ operação finalizada
DONE
// no clique, faz um Ajax para pegar o xcom-reviews.json
showReviewsEl.addEventListener('click', () => {
let requisicao = new XMLHttpRequest();
requisicao.open('GET', 'xcom-reviews.json');
requisicao.responseType = 'json';
requisicao.onreadystatechange = () => {
// chegando a resposta, põe as avaliações na página
if (requisicao.readyState === 4) {
if (requisicao.status === 200) {
// a resposta é um objeto js que tem 'avaliacoes'
let avaliacoes = requisicao.response.avaliacoes;
reviewsEl.innerHTML = '';
avaliacoes.forEach(criaAvaliacaoNaPagina);
}
}
}
requisicao.send();
});
{
"avaliacoes": [
{
"autor": "Astolfo Lombardi",
"recomenda": true,
"comentario": "Um jogo de ETs sinistrões",
"curtidas": 18
},
{
"autor": "Eymael Fortunato",
"recomenda": true,
"comentario": "Rola uma parada sadia entre
humanos e aliens neste jogo #sqn",
"curtidas": 7
} /* ...+2 avaliações */
]
}
XMLHttpRequest
para facilitar a
realização de requisições Ajax. Exemplo:
$.ajax({
url: '/tweets/pagina/5',
dataType: 'json',
success: resposta => {
let novosTweets = resposta.arrayComNovosTweets;
novosTweets.forEach(colocaTweetNaPagina);
}
});
$.getJSON({...})
, equivalente a
$.ajax({...})
com o dataType: 'json'
$('#show-reviews').click(() => {
$.ajax({
url: 'xcom-reviews.json',
dataType: 'json',
success: resposta => {
// a resposta é um objeto js que contém uma propriedade avaliacoes
let avaliacoes = resposta.avaliacoes;
// limpamos a <div id="reviews">...</div>
$reviews.empty();
// percorremos as avaliacoes, colocando elementos na página
avaliacoes.forEach(criaAvaliacaoNaPagina);
}
});
});
fetch(...)
Promessa: algo que pode dar certo, ou errado. Coutinho
fetch(url, opcoes)
.then(callbackSucesso)
.catch(callbackErro);
showReviewsEl.addEventListener('click', () => {
fetch('xcom-reviews.json') // retorna uma *promessa*
.then(resposta => resposta.json()) // lê a resp. como JSON
.then(dados => {
// a resposta é um objeto js que contém uma propriedade avaliacoes
let avaliacoes = dados.avaliacoes;
reviewsEl.innerHTML = '';
avaliacoes.forEach(criaAvaliacaoNaPagina);
});
});
});
fetch
(na MDN)fetch(url, opcoes)
retorna uma promessa
url
é para onde a requisição será enviadaopcoes
serão mostradas no próximo slideResponse
,
que pode ser lida de diferentes formas:
response.json()
response.text()
response.arrayBuffer()
response.blob()
response.formData()
Exemplos:
// usando .then, lendo como json
fetch('https://lalala.com/users')
.then(resposta => resposta.json())
.then(dados => console.log(dados))
// usando async/await (como json)
const resposta = await fetch('htt...')
const dados = await resposta.json()
console.log(dados)
fetch
fetch(url, {
method: 'POST', // *GET, POST, PUT, DELETE, etc.
headers: {
'Content-Type': 'application/json'
// 'Content-Type': 'application/x-www-form-urlencoded',
},
redirect: 'follow', // manual, *follow, error
body: JSON.stringify(data) // deve ter mesmo "Content-Type" do header
})
.then(resposta => resposa.json())
.then(....)
}
https://swapi.dev/api/films/1/
como a URL$ python -m SimpleHTTPServer