Como devo analisar o JSON usando o Node.js? Existe algum módulo que validará e analisará o JSON com segurança?
javascript
json
node.js
Tikhon Jelvis
fonte
fonte
você pode exigir arquivos .json.
Por exemplo, se você tiver um
config.json
arquivo no mesmo diretório do seu arquivo de código-fonte, você usaria:ou (a extensão do arquivo pode ser omitida):
observe que
require
é síncrono e lê o arquivo apenas uma vez ; as chamadas a seguir retornam o resultado do cacheObserve também que você só deve usar isso para arquivos locais sob seu controle absoluto, pois ele potencialmente executa qualquer código dentro do arquivo.
fonte
require
é síncrono. Se você deseja sincronizar o uso amigávelfs.readFile
comJSON.parse
.json
extensão! Se o seu arquivo NÃO tiver a.json
extensão, o request não o tratará como um arquivo json.Você pode usar
JSON.parse()
.Você deve poder usar o
JSON
objeto em qualquer implementação JavaScript compatível com ECMAScript 5 . E a V8 , na qual o Node.js é construído, é um deles.Analisando uma sequência contendo dados JSON
Analisando um arquivo contendo dados JSON
Você terá que fazer algumas operações de arquivo com o
fs
móduloVersão assíncrona
Versão síncrona
Você quer usar
require
? Pense de novo!Às vezes você pode usar
require
:Mas, eu não recomendo isso por vários motivos:
require
é síncrono. Se você tiver um arquivo JSON muito grande, ele bloqueará seu loop de eventos. Você realmente precisa usarJSON.parse
comfs.readFile
.require
irá ler o arquivo apenas uma vez . As chamadas subseqüentesrequire
para o mesmo arquivo retornarão uma cópia em cache. Não é uma boa ideia se você deseja ler um.json
arquivo que é atualizado continuamente. Você pode usar um hack . Mas, neste ponto, é mais fácil simplesmente usarfs
..json
extensão,require
não tratará o conteúdo do arquivo como JSON.A sério! Use
JSON.parse
.load-json-file
móduloSe você está lendo um grande número de
.json
arquivos (e se você é extremamente preguiçoso), torna-se irritante escrever código padrão sempre. Você pode salvar alguns caracteres usando oload-json-file
móduloVersão assíncrona
Versão síncrona
Analisando JSON de Fluxos
Se o conteúdo JSON for transmitido pela rede, você precisará usar um analisador JSON de streaming. Caso contrário, ele amarrará seu processador e bloqueará seu loop de eventos até que o conteúdo JSON seja totalmente transmitido.
Existem muitos pacotes disponíveis no NPM para isso. Escolha o que é melhor para você.
Tratamento de erros / segurança
Se você não tiver certeza se o que foi transmitido
JSON.parse()
é JSON válido , certifique-se de incluir a chamadaJSON.parse()
dentro de umtry/catch
bloco. Um usuário que forneceu uma string JSON pode travar seu aplicativo e até levar a falhas de segurança. Certifique-se de que a manipulação de erros seja realizada se você analisar o JSON fornecido externamente.fonte
and could even lead to security holes
por curiosidade, como?<script>...
e o erro foi derramado no lado do cliente, você tem um bug do XSS ali. Portanto, o IMO é importante para lidar com erros JSON exatamente onde você os analisa.require
para incluir JSON?" e nem se deu ao trabalho de documentar os efeitos colaterais. Isso também significava que exigir aceita arquivos em dois idiomas: JavaScript e JSON (não, eles não são os mesmos). Tanta coisa para SRP.use o objeto JSON :
fonte
Outro exemplo de JSON.parse:
fonte
Eu gostaria de mencionar que existem alternativas para o objeto JSON global.
JSON.parse
eJSON.stringify
são síncronos; portanto, se você deseja lidar com grandes objetos, consulte alguns dos módulos JSON assíncronos.Dê uma olhada: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json
fonte
JSON.parse
todo o aplicativo falhar ou, usando-oprocess.on('uncaughtException', function(err) { ... });
, não haverá chance de enviar um erro "JSON malformado" ao usuário.async
analisador? Eu não encontrei isso.Inclua a
node-fs
biblioteca.Para mais informações sobre a biblioteca 'fs', consulte a documentação em http://nodejs.org/api/fs.html
fonte
Como você não sabe que sua string é realmente válida, eu a colocaria primeiro em uma tentativa. Além disso, como os blocos try catch não são otimizados por nó, eu colocaria a coisa inteira em outra função:
OU no "estilo assíncrono"
fonte
Analisando um fluxo JSON? Use
JSONStream
.https://github.com/dominictarr/JSONStream
fonte
Todo mundo aqui falou sobre JSON.parse, então pensei em dizer outra coisa. Há um ótimo módulo Conecte-se a muitos middlewares para facilitar e melhorar o desenvolvimento de aplicativos. Um dos middlewares é o bodyParser . Ele analisa JSON, html-forms e etc. Há também um middleware específico para JSON que analisa apenas noop .
Dê uma olhada nos links acima, pode ser realmente útil para você.
fonte
Isso é tudo.
fonte
como outras respostas mencionadas aqui, você provavelmente deseja exigir um arquivo json local que você sabe que é seguro e presente, como um arquivo de configuração:
ou para usar o objeto JSON global para analisar um valor de sequência em um objeto:
Observe que, quando você exige um arquivo, o conteúdo desse arquivo é avaliado, o que apresenta um risco à segurança, caso não seja um arquivo json, mas um arquivo js.
publiquei uma demonstração em que é possível ver os dois métodos e jogar com eles on-line (o exemplo de análise está no arquivo app.js - clique no botão executar e veja o resultado no terminal): http: // staging1 .codefresh.io / labs / api / env / json-parse-example
você pode modificar o código e ver o impacto ...
fonte
Usando JSON para sua configuração com o Node.js? Leia isso e obtenha suas habilidades de configuração acima de 9000 ...
Os aplicativos adequados vêm em mais de 3 camadas de configuração:
A maioria dos desenvolvedores trata suas configurações de servidor e aplicativo como se isso pudesse mudar. Não pode. Você pode colocar as alterações das camadas superiores umas sobre as outras, mas está modificando os requisitos básicos . Algumas coisas precisam existir! Faça sua configuração agir como se fosse imutável, porque parte disso é basicamente como o seu código-fonte.
Não perceber que muitas das suas coisas não serão alteradas após a inicialização leva a antipadrões, como desarrumar o carregamento da sua configuração com blocos try / catch e fingir que você pode continuar sem o aplicativo de configuração adequado. Você não pode. Se possível, isso pertence à camada de configuração da comunidade / usuário, não à camada de configuração do servidor / aplicativo. Você está fazendo errado. O material opcional deve ser colocado em camadas quando o aplicativo terminar sua inicialização.
Pare de bater com a cabeça na parede: sua configuração deve ser extremamente simples .
Veja como é fácil configurar algo tão complexo quanto uma estrutura de serviço independente de protocolo e independente de fonte de dados usando um arquivo json config simples e um arquivo app.js simples ...
container-config.js ...
index.js ... (o mecanismo que alimenta tudo)
app.js ... (o código que alimenta seu serviço independente de protocolo e de origem de dados)
Usando esse padrão, agora você pode carregar itens de configuração da comunidade e do usuário sobre o aplicativo inicializado, o dev ops está pronto para colocar seu trabalho em um contêiner e escalá-lo. Você é lido para vários participantes. Userland é isolado. Agora você pode separar as preocupações sobre qual protocolo de serviço você está usando, qual tipo de banco de dados você está usando e se concentrar apenas em escrever um bom código.
Como você está usando camadas, pode confiar em uma única fonte de verdade para tudo, a qualquer momento (o objeto de configuração em camadas) e evitar verificações de erro a cada passo, preocupando-se com "oh droga, como vou fazer isso trabalhar sem a configuração adequada?!? ".
fonte
Minha solução:
fonte
TypeError: path must be a string or Buffer
erros - alguma idéia de onde começar a depurar esse problema?Só quero completar a resposta (como eu lutei com ela por um tempo), quero mostrar como acessar as informações do json, este exemplo mostra como acessar o Json Array:
fonte
Apenas para tornar isso o mais complicado possível e trazer o maior número possível de pacotes ...
Isso permite que você faça:
Ou se você estiver usando async / waitit:
A vantagem de apenas usar
readFileSync
é que o servidor Node pode processar outras solicitações enquanto o arquivo está sendo lido no disco.fonte
O JSON.parse não garantirá a segurança da string json que você está analisando. Você deve olhar para uma biblioteca como json-safe-parse ou uma biblioteca semelhante.
Na página json-safe-parse npm:
fonte
Utilize a função de tentativa do Lodash para retornar um objeto de erro, que você pode manipular com a função isError.
fonte
.bind
ao invés de apenas usar _.attempt (JSON.parse, str)Sempre certifique-se de usar JSON.parse em try catch block, pois o nó sempre gera um erro inesperado se você tiver alguns dados corrompidos em seu json; portanto, use esse código em vez de JSON.Parse simples
fonte
Se você quiser adicionar alguns comentários no seu JSON e permitir vírgulas finais, use a implementação abaixo:
Observe que pode não funcionar bem se você tiver algo parecido
"abc": "foo // bar"
no seu JSON. Então YMMV.fonte
Se o arquivo de origem JSON for muito grande, convém considerar a rota assíncrona por meio da abordagem nativa async / waitit com o Node.js. 8.0 da seguinte maneira
fonte
Eu uso fs-extra . Gosto muito porque, apesar de suportar retornos de chamada, também oferece suporte a Promises . Por isso, apenas me permite escrever meu código de uma maneira muito mais legível:
Ele também possui muitos métodos úteis que não acompanham o
fs
módulo padrão e , além disso, também faz a ponte dos métodos dofs
módulo nativo e os promete.Então é basicamente todas as vantagens. Espero que outros achem isso útil.
fonte
Se você precisar analisar JSON com Node.js de maneira segura (ou seja: o usuário pode inserir dados ou uma API pública), sugiro usar secure-json-parse .
O uso é como o padrão,
JSON.parse
mas protegerá seu código de:fonte
Você pode usar JSON.parse () (que é uma função interna que provavelmente o forçará a envolvê-lo com instruções try-catch).
Ou use alguma biblioteca npm de análise JSON, algo como json-parse-or
fonte
Use isso para estar do lado seguro
fonte
O NodeJs é um servidor baseado em JavaScript , para que você possa fazer isso em JavaScript puro ...
Imagine que você tem esse Json em NodeJs ...
E você pode fazer acima para obter uma versão analisada do seu json ...
fonte
Conforme mencionado nas respostas acima, podemos usar
JSON.parse()
para analisar as seqüências de caracteres em JSON. Antes de analisar, certifique-se de analisar os dados corretos, caso contrário, poderá interromper o aplicativo inteiroé seguro usá-lo assim
fonte
Use
JSON.parse(str);
. Leia mais sobre isso aqui .aqui estão alguns exemplos:
fonte
Nenhum módulo adicional precisa ser necessário.
Basta usar.
var parsedObj = JSON.parse(yourObj);
Eu acho que existem problemas de segurança com relação a isso.
fonte
É simples, você pode converter JSON em string usando
JSON.stringify(json_obj)
e converter string em JSON usandoJSON.parse("your json string")
.fonte