답변:
간단하게 사용할 수 있습니다 JSON.parse
.
JSON
객체 의 정의 는 ECMAScript 5 사양의 일부입니다 . node.js는 ECMA 표준을 준수하는 Chrome의 V8 엔진을 기반으로합니다. 따라서 node.js에는 전역 객체 [docs]도 있습니다.JSON
주 – JSON.parse
현재 스레드는 동기식이기 때문에 묶을 수 있습니다. 따라서 큰 JSON 객체를 구문 분석하려는 경우 스트리밍 json 파서를 사용하십시오.
.json 파일 이 필요할 수 있습니다.
var parsedJSON = require('./file-name');
예를 들어 config.json
소스 코드 파일과 동일한 디렉토리에 파일 이있는 경우 다음을 사용합니다.
var config = require('./config.json');
또는 (파일 확장자는 생략 할 수 있습니다) :
var config = require('./config');
참고 require
인 동기 만 파일을 읽고 한 번은 , 다음의 호출은 캐시에서 결과를 반환
또한 파일 내에서 코드를 실행할 가능성이 있으므로 절대 제어 하의 로컬 파일에만이 파일을 사용해야합니다.
require
동기식입니다. 당신은 쉬운 사용을 비동기하려면 fs.readFile
대신에JSON.parse
.json
확장명 을 사용하는 것을 잊지 마십시오 ! 파일의 .json
확장자가 없으면 require는 파일을 json 파일로 취급하지 않습니다.
사용할 수 있습니다JSON.parse()
.
ECMAScript 5 호환 JavaScript 구현 에서 JSON
객체 를 사용할 수 있어야합니다 . 그리고 Node.js가 구축되는 V8도 그중 하나입니다.
참고 : 민감한 정보 (예 : 비밀번호)를 저장하기 위해 JSON 파일을 사용하는 경우 잘못된 방법입니다. Heroku가 어떻게 작동하는지 확인하십시오 : https://devcenter.heroku.com/articles/config-vars#setting-up-config-vars-for-a-deployed-application . 플랫폼이 어떻게 작동하는지 알아보고
process.env
코드 내에서 구성 변수를 검색하는 데 사용 하십시오.
var str = '{ "name": "John Doe", "age": 42 }';
var obj = JSON.parse(str);
fs
모듈로 일부 파일 작업을 수행해야 합니다.
var fs = require('fs');
fs.readFile('/path/to/file.json', 'utf8', function (err, data) {
if (err) throw err; // we'll not consider error handling for now
var obj = JSON.parse(data);
});
var fs = require('fs');
var json = JSON.parse(fs.readFileSync('/path/to/file.json', 'utf8'));
require
습니까? 다시 생각 해봐!var obj = require('path/to/file.json');
그러나 여러 가지 이유로 이것을 권장하지 않습니다.
require
동기식입니다. 매우 큰 JSON 파일이 있으면 이벤트 루프가 질식됩니다. JSON.parse
와 함께 사용해야 합니다 fs.readFile
.require
파일을 한 번만 읽습니다 . require
동일한 파일 에 대한 후속 호출 은 캐시 된 사본을 리턴합니다. .json
지속적으로 업데이트 되는 파일 을 읽으려는 경우 좋지 않습니다. 당신은 핵을 사용할 수 있습니다 . 그러나이 시점에서 간단히 사용하는 것이 더 쉽습니다 fs
..json
확장자 require
가 없으면 파일 내용을 JSON으로 처리하지 않습니다.진심으로! 사용하십시오JSON.parse
.
load-json-file
구성 단위많은 수의 .json
파일을 읽는 경우 (그리고 매우 게으른 경우) 매번 상용구 코드를 작성하는 것이 성가 시게됩니다. load-json-file
모듈 을 사용하여 일부 문자를 저장할 수 있습니다 .
const loadJsonFile = require('load-json-file');
loadJsonFile('/path/to/file.json').then(json => {
// `json` contains the parsed object
});
let obj = loadJsonFile.sync('/path/to/file.json');
JSON 컨텐츠가 네트워크를 통해 스트리밍되는 경우 스트리밍 JSON 구문 분석기를 사용해야합니다. 그렇지 않으면 프로세서를 묶고 JSON 콘텐츠가 완전히 스트리밍 될 때까지 이벤트 루프를 질식시킵니다.
이를 위해 NPM 에서 사용할 수있는 패키지 가 많이 있습니다 . 가장 적합한 것을 선택하십시오.
전달 된 JSON.parse()
것이 유효한 JSON 인지 확실하지 않은 경우 호출을 블록 JSON.parse()
안에 넣어야합니다 try/catch
. 사용자가 제공 한 JSON 문자열은 응용 프로그램을 중단시키고 보안 허점으로 이어질 수 있습니다. 외부 제공 JSON을 구문 분석하는 경우 오류 처리가 수행되었는지 확인하십시오.
and could even lead to security holes
호기심에서 어떻게?
<script>...
되어 있고 오류가 클라이언트 측에 유출되면 XSS 버그가있는 것입니다. 따라서 IMO는 구문 분석하는 곳에서 JSON 오류를 처리하는 것이 중요합니다.
require
JSON을 포함 시키는 것이 멋지지 않을까?" 라고 생각한 것 같습니다. 부작용을 문서화하지 않아도됩니다. 이것은 또한 JavaScript와 JSON이라는 두 가지 언어로 된 파일을 필요로한다는 것을 의미했습니다 (동일하지 않음). SRP를 위해 너무 많은.
JSON 객체를 사용하십시오 .
JSON.parse(str);
JSON.parse의 또 다른 예 :
var fs = require('fs');
var file = __dirname + '/config.json';
fs.readFile(file, 'utf8', function (err, data) {
if (err) {
console.log('Error: ' + err);
return;
}
data = JSON.parse(data);
console.dir(data);
});
글로벌 JSON 객체에 대한 대안이 있다고 언급하고 싶습니다.
JSON.parse
그리고 JSON.stringify
당신이 비동기 JSON 모듈의 일부를 체크 아웃 할 수있는 큰 개체를 처리 할 그렇다면, 동기식입니다.
: 봐 가지고 https://github.com/joyent/node/wiki/Modules#wiki-parsers-json을
JSON.parse
전체 애플리케이션에서 잘못된 JSON을 구문 분석하는 중이 발생하거나을 (를 ) 사용하는 process.on('uncaughtException', function(err) { ... });
경우 결국 "잘못된 JSON"오류를 사용자에게 보낼 기회가 없습니다.
async
파서입니까? 나는 그것을 찾지 못했다.
node-fs
라이브러리를 포함하십시오 .
var fs = require("fs");
var file = JSON.parse(fs.readFileSync("./PATH/data.json", "utf8"));
'fs'라이브러리에 대한 자세한 내용은 http://nodejs.org/api/fs.html 의 설명서를 참조하십시오.
문자열이 실제로 유효한지 알지 못하므로 먼저 시도 catch에 넣습니다. 또한 try catch 블록은 노드별로 최적화되지 않았으므로 전체 기능을 다른 함수에 넣습니다.
function tryParseJson(str) {
try {
return JSON.parse(str);
} catch (ex) {
return null;
}
}
또는 "비동기 스타일"
function tryParseJson(str, callback) {
process.nextTick(function () {
try {
callback(null, JSON.parse(str));
} catch (ex) {
callback(ex)
}
})
}
JSON 스트림을 파싱 하시겠습니까? 사용하십시오 JSONStream
.
var request = require('request')
, JSONStream = require('JSONStream')
request({url: 'http://isaacs.couchone.com/registry/_all_docs'})
.pipe(JSONStream.parse('rows.*'))
.pipe(es.mapSync(function (data) {
return data
}))
여기의 모든 사람들이 JSON.parse에 대해 이야기 했으므로 다른 것을 말할 생각이었습니다. 앱 개발을보다 쉽고 개선하기 위해 많은 미들웨어와 연결 되는 훌륭한 모듈이 있습니다 . 미들웨어 중 하나는 bodyParser 입니다. JSON, html-forms 등을 구문 분석합니다 . JSON 구문 분석 전용 noop에 대한 특정 미들웨어도 있습니다 .
위의 링크를 살펴보면 정말 도움이 될 것입니다.
여기에 다른 답변에서 언급했듯이 구성 파일과 같이 안전하고 존재하는 로컬 json 파일이 필요할 수 있습니다.
var objectFromRequire = require('path/to/my/config.json');
또는 전역 JSON 객체를 사용하여 문자열 값을 객체로 구문 분석합니다.
var stringContainingJson = '\"json that is obtained from somewhere\"';
var objectFromParse = JSON.parse(stringContainingJson);
파일이 필요할 때 해당 파일의 내용이 평가되므로 json 파일이 아니라 js 파일 인 경우 보안 위험이 발생합니다.
여기에 두 가지 방법을 모두 볼 수 있고 온라인으로 재생할 수있는 데모를 게시했습니다 (구문 분석 예제는 app.js 파일에 있습니다-실행 버튼을 클릭하고 터미널에서 결과를 확인하십시오) : http : // staging1 .codefresh.io / labs / api / env / json-parse-example
코드를 수정하고 그 영향을 볼 수 있습니다 ...
Node.js로 구성에 JSON을 사용하십니까? 이것을 읽고 9000 이상의 구성 기술을 얻으십시오 ...
참고 : 데이터를 주장하는 사람들 = require ( './ data.json'); 보안 위험이며 열성적인 열심으로 사람들의 대답을 내리는 것입니다. 당신은 정확하고 완전히 틀 렸습니다 . 해당 파일에 비 JSON을 배치하려고 ... 노드가 당신에게 오류를 제공합니다 정확하게 당신이와 같은 일을 한 경우는 것처럼 많은 코드를 수동 파일 읽기에 느린 열심히하고 이후의 JSON.parse (). 잘못된 정보 확산을 중지하십시오. 당신은 세상을 아프게하고 있습니다. 노드는 이것을 허용 하도록 설계되었습니다 . 보안 위험이 아닙니다!
적절한 응용 프로그램은 3 층 이상의 구성으로 제공됩니다.
대부분의 개발자는 서버 및 앱 구성을 변경 가능한 것처럼 취급합니다. 할 수 없습니다. 당신은 할 수 변경 레이어 서로 상단에 상위 계층에서,하지만 당신은하고 기본 요구 사항을 수정 . 몇 가지 존재 해야 합니다! 일부는 기본적으로 소스 코드와 동일하기 때문에 구성을 불변으로 작동하게하십시오.
시작 후 많은 것들이 변경되지 않는 것을 보지 못하면 try / catch 블록으로 구성 로딩을 중단하고 올바른 설정 응용 프로그램 없이 계속 진행하는 것처럼 안티 패턴으로 이어집니다 . 당신은 할 수 없습니다. 가능하면 서버 / 앱 구성 계층이 아닌 커뮤니티 / 사용자 구성 계층에 속합니다. 당신은 단지 잘못하고 있습니다. 응용 프로그램이 부트 스트랩을 마치면 선택적 항목을 맨 위에 겹쳐 놓아야합니다.
벽에 머리를 대지 마십시오. 설정은 매우 간단 해야합니다 .
간단한 json 구성 파일과 간단한 app.js 파일을 사용하여 프로토콜에 구애받지 않고 데이터 소스에 구애받지 않는 서비스 프레임 워크와 같이 복잡한 것을 설정하는 것이 얼마나 쉬운 지 살펴보십시오 ...
container-config.js ...
{
"service": {
"type" : "http",
"name" : "login",
"port" : 8085
},
"data": {
"type" : "mysql",
"host" : "localhost",
"user" : "notRoot",
"pass" : "oober1337",
"name" : "connect"
}
}
index.js ... (모든 것을 구동하는 엔진)
var config = require('./container-config.json'); // Get our service configuration.
var data = require(config.data.type); // Load our data source plugin ('npm install mysql' for mysql).
var service = require(config.service.type); // Load our service plugin ('http' is built-in to node).
var processor = require('./app.js'); // Load our processor (the code you write).
var connection = data.createConnection({ host: config.data.host, user: config.data.user, password: config.data.pass, database: config.data.name });
var server = service.createServer(processor);
connection.connect();
server.listen(config.service.port, function() { console.log("%s service listening on port %s", config.service.type, config.service.port); });
app.js ... (프로토콜에 구애받지 않고 데이터 소스에 구애받지 않는 서비스를 지원하는 코드)
module.exports = function(request, response){
response.end('Responding to: ' + request.url);
}
이 패턴을 사용하여 이제 부팅 된 앱 위에 커뮤니티 및 사용자 구성 항목을로드 할 수 있습니다. dev ops는 작업을 컨테이너에 넣고 확장 할 수 있습니다. 다중 테넌트를 읽습니다. Userland는 격리되어 있습니다. 사용중인 서비스 프로토콜, 사용중인 데이터베이스 유형에 대한 우려를 분리하고 좋은 코드 작성에만 집중할 수 있습니다.
당신이 레이어를 사용하기 때문에, 당신은 젠장, 내가 어떻게 만들려고하고있다 "걱정, 언제든지 (계층화 설정 개체)에서, 모두를위한 진리의 단일 소스에 의존하고, 모든 단계에서 피할 오류를 검사 할 수 이 적절한 구성없이 작업 하시겠습니까?!? ".
내 해결책 :
var fs = require('fs');
var file = __dirname + '/config.json';
fs.readFile(file, 'utf8', function (err, data) {
if (err) {
console.log('Error: ' + err);
return;
}
data = JSON.parse(data);
console.dir(data);
});
TypeError: path must be a string or Buffer
오류가 계속 발생 합니다.이 문제를 디버깅하기 시작하는 곳을 알고 있습니까?
대답을 완성하고 싶었습니다 (잠깐 동안 어려움을 겪었습니다) .json 정보에 액세스하는 방법을 보여주고 싶습니다.이 예제는 Json Array에 액세스하는 것을 보여줍니다.
var request = require('request');
request('https://server/run?oper=get_groups_joined_by_user_id&user_id=5111298845048832', function (error, response, body) {
if (!error && response.statusCode == 200) {
var jsonArr = JSON.parse(body);
console.log(jsonArr);
console.log("group id:" + jsonArr[0].id);
}
})
이것을 가능한 한 복잡하게 만들고 가능한 많은 패키지를 가져 오려면 ...
const fs = require('fs');
const bluebird = require('bluebird');
const _ = require('lodash');
const readTextFile = _.partial(bluebird.promisify(fs.readFile), _, {encoding:'utf8',flag:'r'});
const readJsonFile = filename => readTextFile(filename).then(JSON.parse);
이를 통해 다음을 수행 할 수 있습니다.
var dataPromise = readJsonFile("foo.json");
dataPromise.then(console.log);
또는 async / await를 사용하는 경우 :
let data = await readJsonFile("foo.json");
readFileSync
파일을 디스크에서 읽는 동안 노드 서버가 다른 요청을 처리 할 수 있다는 장점 만 있습니다.
JSON.parse는 구문 분석중인 json 문자열의 안전을 보장하지 않습니다. json-safe-parse 와 같은 라이브러리 또는 유사한 라이브러리를 봐야 합니다.
json-safe-parse npm 페이지에서 :
JSON.parse는 훌륭하지만 JavaScript와 관련하여 하나의 심각한 결함이 있습니다. 상속 된 속성을 재정의 할 수 있습니다. 신뢰할 수없는 소스 (예 : 사용자)에서 JSON을 구문 분석하고 존재하는 함수를 호출하는 경우 문제가 될 수 있습니다.
Lodash의 시도 함수를 활용하여 isError 함수로 처리 할 수있는 오류 객체를 반환합니다.
// Returns an error object on failure
function parseJSON(jsonString) {
return _.attempt(JSON.parse.bind(null, jsonString));
}
// Example Usage
var goodJson = '{"id":123}';
var badJson = '{id:123}';
var goodResult = parseJSON(goodJson);
var badResult = parseJSON(badJson);
if (_.isError(goodResult)) {
console.log('goodResult: handle error');
} else {
console.log('goodResult: continue processing');
}
// > goodResult: continue processing
if (_.isError(badResult)) {
console.log('badResult: handle error');
} else {
console.log('badResult: continue processing');
}
// > badResult: handle error
.bind
대신 (JSON.parse, STR) _.attempt를 사용
JSON에 주석을 추가하고 후행 쉼표를 허용하려면 아래 구현을 사용할 수 있습니다.
var fs = require('fs');
var data = parseJsData('./message.json');
console.log('[INFO] data:', data);
function parseJsData(filename) {
var json = fs.readFileSync(filename, 'utf8')
.replace(/\s*\/\/.+/g, '')
.replace(/,(\s*\})/g, '}')
;
return JSON.parse(json);
}
"abc": "foo // bar"
JSON 과 같은 것이 있으면 제대로 작동하지 않을 수 있습니다 . YMMV입니다.
JSON 소스 파일이 꽤 큰 경우 Node.js 8.0의 기본 async / await 접근 방식을 통한 비동기 경로를 다음과 같이 고려할 수 있습니다.
const fs = require('fs')
const fsReadFile = (fileName) => {
fileName = `${__dirname}/${fileName}`
return new Promise((resolve, reject) => {
fs.readFile(fileName, 'utf8', (error, data) => {
if (!error && data) {
resolve(data)
} else {
reject(error);
}
});
})
}
async function parseJSON(fileName) {
try {
return JSON.parse(await fsReadFile(fileName));
} catch (err) {
return { Error: `Something has gone wrong: ${err}` };
}
}
parseJSON('veryBigFile.json')
.then(res => console.log(res))
.catch(err => console.log(err))
내가 사용 FS-여분 . 콜백을 지원하지만 Promises 도 지원하기 때문에 많이 좋아합니다 . 따라서 코드를 훨씬 더 읽기 쉬운 방식으로 작성할 수 있습니다.
const fs = require('fs-extra');
fs.readJson("path/to/foo.json").then(obj => {
//Do dome stuff with obj
})
.catch(err => {
console.error(err);
});
또한 표준 fs
모듈 과 함께 제공되지 않는 유용한 방법이 많이 있으며 그 외에도 기본 fs
모듈 의 방법을 연결하여 약속합니다.
참고 : 여전히 기본 Node.js 메소드를 사용할 수 있습니다. 그것들은 약속되어 fs-extra로 복사됩니다. 에 대한 참고 사항을 참조하십시오
fs.read()
&를fs.write()
기본적으로 모든 장점입니다. 다른 사람들이 이것을 유용하게 사용하기를 바랍니다.
안전한 방법으로 (즉, 사용자가 데이터를 입력하거나 공개 API를 사용할 수 있음) JSON을 Node.js로 구문 분석해야하는 경우 secure-json-parse를 사용하는 것이 좋습니다 .
사용법은 기본값과 JSON.parse
같지만 코드를 다음으로부터 보호합니다.
const badJson = '{ "a": 5, "b": 6, "__proto__": { "x": 7 }, "constructor": {"prototype": {"bar": "baz"} } }'
const infected = JSON.parse(badJson)
console.log(infected.x) // print undefined
const x = Object.assign({}, infected)
console.log(x.x) // print 7
const sjson = require('secure-json-parse')
console.log(sjson.parse(badJson)) // it will throw by default, you can ignore malicious data also
JSON.parse () (try-catch 문으로 랩핑 해야하는 내장 함수)을 사용할 수 있습니다.
또는 json-parse-or 와 같은 JSON 구문 분석 npm 라이브러리를 사용하십시오.
이것을 안전한쪽에 두십시오
var data = JSON.parse(Buffer.concat(arr).toString());
간단합니다.를 사용하여 JSON을 문자열 JSON.stringify(json_obj)
로 변환하고 문자열을 JSON을 사용하여 변환 할 수 있습니다JSON.parse("your json string")
.