# O que é JSON (JavaScript Object Notation)?
- [ ] Um objeto JavaScript propriamente dito
- [X] Um formato de dados textual, leve, inspirado na sintaxe de objetos JavaScript
- [ ] Uma classe nativa do JavaScript
- [ ] Uma linguagem de programação
# Qual é a diferença fundamental entre um objeto JavaScript e um documento JSON?
- [ ] Não existe diferença, são a mesma coisa
- [X] JSON é apenas texto seguindo regras específicas; um objeto JavaScript é uma estrutura de dados em memória, que pode ter métodos e funções
- [ ] JSON só pode representar números
- [ ] Um objeto JavaScript só pode ser criado a partir de um JSON
# Quais destes valores NÃO são válidos em JSON?
- [ ] String, número e booleano
- [ ] Objeto e array
- [X] Função e `undefined`
- [ ] `null`
# O que o método `JSON.stringify()` faz?
- [X] Converte um objeto JavaScript em uma string no formato JSON
- [ ] Converte uma string JSON em um objeto JavaScript
- [ ] Remove propriedades privadas de um objeto
- [ ] Cria uma nova instância de uma classe
# O que o método `JSON.parse()` faz?
- [ ] Converte um objeto JavaScript em uma string JSON
- [X] Converte uma string no formato JSON em um objeto JavaScript
- [ ] Valida se um objeto é uma instância de uma classe
- [ ] Formata um JSON com indentação
# Por que `JSON.stringify(user)` retorna `"{}"` quando `user` é uma instância de uma classe com todos os atributos privados (símbolo `#`)?
- [ ] Porque `JSON.stringify()` não existe para objetos de classes
- [X] Porque `JSON.stringify()` só enxerga propriedades públicas e enumeráveis, e atributos privados não são visíveis por fora da classe (encapsulamento)
- [ ] Porque é necessário chamar `JSON.parse()` antes
- [ ] Porque a classe precisa herdar de `Object` explicitamente
# Qual é a função do método `toJSON()` em uma classe JavaScript?
- [X] Definir como o objeto deve ser representado quando convertido para JSON, sendo chamado automaticamente por `JSON.stringify()`
- [ ] Converter uma string JSON em um objeto da classe
- [ ] Validar se os atributos da classe são privados
- [ ] Remover atributos indesejados de um objeto antes de salvá-lo em disco
# Ao converter uma instância de `User` (com o método `toJSON()` implementado) que contém um array de `Message`, o que acontece com cada `Message` do array durante a serialização?
- [ ] Somente o primeiro elemento do array é serializado
- [X] Cada `Message` também é convertida usando o seu próprio método `toJSON()`
- [ ] O array inteiro é ignorado
- [ ] É necessário chamar `JSON.stringify()` manualmente para cada mensagem
# Ao aplicar `JSON.parse()` sobre um JSON gerado a partir de um `User`, o que se obtém como resultado?
- [ ] Uma nova instância da classe `User`, com todos os métodos disponíveis
- [X] Um objeto comum (literal), sem os métodos da classe `User`
- [ ] Um erro, pois `JSON.parse()` não funciona com JSON gerado por `toJSON()`
- [ ] Uma string idêntica ao JSON original
# Qual é o objetivo de implementar um método estático `fromJSON` em uma classe?
- [X] Ler um objeto simples produzido por `JSON.parse()` e usá-lo para reconstruir uma verdadeira instância da classe
- [ ] Substituir o método `toJSON()`
- [ ] Impedir que a classe seja serializada em JSON
- [ ] Validar se uma string é um JSON válido antes de convertê-la
# No exemplo apresentado, o que os dois primeiros parâmetros de `fs.writeFileSync` e `fs.readFileSync` representam?
- [ ] O nome do módulo e a versão do Node
- [X] O caminho do arquivo e, respectivamente, o conteúdo a ser gravado ou a codificação usada na leitura
- [ ] O objeto `User` e o objeto `Message`
- [ ] O tipo de dado JSON e o tipo de dado JavaScript