我应该如何使用Node.js解析JSON? 是否有一些模块可以安全地验证和解析JSON?


#1楼

我想提一下,全局JSON对象还有其他选择。 JSON.parseJSON.stringify都是同步的,因此,如果要处理大对象,则可能需要检出一些异步JSON模块。

看看: https : //github.com/joyent/node/wiki/Modules#wiki-parsers-json


#2楼

JSON.parse("your string");

就这样。


#3楼

这里的每个人都讲过JSON.parse,所以我想说些别的。 有一个很棒的模块,可以与许多中间件连接 ,以使应用程序的开发变得更轻松,更好。 中间件之一是bodyParser 。 它解析JSON,html表单等。还有一个特定的中间件,用于仅解析noop的 JSON。

看一下上面的链接,它可能对您真的很有帮助。


#4楼

解析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}))

https://github.com/dominictarr/JSONStream


#5楼

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);
});

#6楼

由于您不知道您的字符串实际上是有效的,因此我将其放在try 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)}})
}

#7楼

包括node-fs库。

var fs = require("fs");
var file = JSON.parse(fs.readFileSync("./PATH/data.json", "utf8"));

有关“ fs”库的更多信息,请参阅位于http://nodejs.org/api/fs.html的文档。


#8楼

很简单,您可以使用JSON.stringify(json_obj)将JSON转换为字符串,并使用JSON.parse("your json string")将字符串转换为JSON。


#9楼

您可以使用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从代码中检索配置变量。


解析包含JSON数据的字符串

var str = '{ "name": "John Doe", "age": 42 }';
var obj = JSON.parse(str);

解析包含JSON数据的文件

您必须使用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 nowvar obj = JSON.parse(data);
});

同步版本

var fs = require('fs');
var json = JSON.parse(fs.readFileSync('/path/to/file.json', 'utf8'));

您想使用require吗? 再想想!

您有时可以使用require

var obj = require('path/to/file.json');

但是,出于以下几个原因,我不建议您这样做:

  1. require是同步的。 如果您有一个很大的JSON文件,它将阻塞您的事件循环。 您确实需要将JSON.parsefs.readFile一起使用。
  2. require读取一次文件。 随后对require相同文件的调用将返回缓存的副本。 如果您想读取不断更新的.json文件,则不是一个好主意。 您可以使用hack 。 但是在这一点上,简单地使用fs更容易。
  3. 如果您的文件没有.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解析器。 否则,它将占用处理器并阻塞事件循环,直到JSON内容完全流式传输为止。

NPM中有许多与此相关的软件包 。 选择最适合您的东西。


错误处理/安全性

如果不确定传递给JSON.parse()是否为有效JSON ,请确保将对JSON.parse()的调用包含在try/catch块内。 用户提供的JSON字符串可能会使您的应用程序崩溃,甚至可能导致安全漏洞。 如果解析外部提供的JSON,请确保已完成错误处理。


#10楼

正如这里提到的其他答案一样,您可能想要使用一个您知道是安全且存在的本地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

您可以修改代码并查看影响...


#11楼

JSON.parse无法确保您解析的json字符串的安全。 您应该查看json-safe-parse之类的库或类似的库。

从json-safe-parse npm页面:

JSON.parse很棒,但是它在JavaScript上下文中有一个严重的缺陷:它允许您覆盖继承的属性。 如果您要从不受信任的来源(例如,用户)解析JSON,并在其上调用您希望存在的函数,这可能会成为问题。


#12楼

我的解决方案:

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);
});

#13楼

利用Lodash的try函数返回错误对象,您可以使用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 processingif (_.isError(badResult)) {console.log('badResult: handle error');
} else {console.log('badResult: continue processing');
}
// > badResult: handle error

#14楼

var fs = require('fs');fs.readFile('ashish.json',{encoding:'utf8'},function(data,err) {if(err) throw err;else {console.log(data.toString());}
})

#15楼

始终确保在try catch块中使用JSON.parse,因为如果JSON中有一些损坏的数据,则节点总是会引发意外错误,因此请使用此代码而不是简单的JSON.Parse

try{JSON.parse(data)
}
catch(e){throw new Error("data is corrupted")}

#16楼

只是为了使其尽可能复杂,并引入尽可能多的软件包...

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);

或者,如果您使用的是异步/等待:

let data = await readJsonFile("foo.json");

与仅使用readFileSync相比,其优势在于,当文件从磁盘上读取时,您的节点服务器可以处理其他请求。


#17楼

这不得不对我大喊:它只适用于.json文件。

如果文件结尾不同,这不起作用!


#18楼

只想完成答案(我在一段时间内苦苦挣扎),想展示如何访问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); } }) 

#19楼

如果要在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);
}

请注意,如果您的JSON中有类似"abc": "foo // bar" ,则可能无法正常工作。 因此,YMMV。


#20楼

使用JSON与Node.js进行配置? 阅读本文,获得超过9000的配置技能...

注意:人们声称data = require('./ data.json'); 这是一种安全隐患,并且会以热心的热情低估人们的回答:您完全是完全错误的 。 尝试将非JSON在该文件中...节点会给你一个错误, 酷似它将如果你读慢得多 ,更难编写手册文件做同样的事情,然后随后的JSON.parse()来。 请停止散布错误信息; 您在伤害世界,无济于事。 Node被设计为允许这样做; 这不是安全隐患!

正确的应用程序包含3 以上的配置:

  1. 服务器/容器配置
  2. 应用配置
  3. (可选)租户/社区/组织配置
  4. 用户配置

大多数开发人员将其服务器和应用程序配置视为可以更改的。 不可以 您可以将高层的更改彼此叠加,但是您正在修改基本需求 。 有些事情需要存在! 使您的配置看起来像是不可变的,因为其中的一些基本上就像您的源代码一样。

在启动导致反模式(例如,用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);
}

使用此模式,您现在可以在启动的应用程序顶部加载社区和用户配置内容,开发人员可以将您的工作推入容器并进行扩展。 您正在阅读多租户。 用户区是隔离的。 现在,您可以区分所使用的服务协议,所使用的数据库类型的关注点,而只专注于编写良好的代码。

因为你使用的图层,你可以依靠真理的一切的单一来源,在任何时候(分层配置对象),并避免错误检查步步为营,担心“哦废话,我怎么能让这个没有正确的配置就可以工作?!?”。


#21楼

您可以使用JSON.parse()(这是一个内置函数,可能会迫使您使用try-catch语句包装它)。

或使用JSON解析npm库,例如json-parse-or


#22楼

为了安全起见,请使用它

var data = JSON.parse(Buffer.concat(arr).toString());

#23楼

使用JSON.parse(str); 。 在这里。

这里有些例子:

var jsonStr = '{"result":true, "count":42}';obj = JSON.parse(jsonStr);console.log(obj.count);    //expected output: 42
console.log(obj.result);   // expected output: true

#24楼

无需其他模块。
只需使用
var parsedObj = JSON.parse(yourObj);
我不认为与此有关的任何安全问题


#25楼

如果JSON源文件很大,则可能要考虑使用Node.js 8.0通过本机异步/等待方法进行异步路由,如下所示

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))

#26楼

我使用fs-extra 。 我非常喜欢它,因为-尽管它支持回调-它也支持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模块和promisifies他们。

注意:您仍然可以使用本机Node.js方法。 它们被承诺并复制到fs-extra。 请参阅有关fs.read()fs.write()注释

因此,这基本上是所有优点。 我希望其他人觉得这有用。


#27楼

NodeJs是基于JavaScript的服务器,因此您可以采用纯JavaScript的方式进行操作...

假设您在NodeJ中有这个Json ...

var details = '{ "name": "Alireza Dezfoolian", "netWorth": "$0" }';
var obj = JSON.parse(details);

您可以执行上述操作以获取json的解析版本...


#28楼

如以上答案中所述,我们可以使用JSON.parse()将字符串解析为JSON,但是在解析之前,请确保解析正确的数据,否则可能会导致整个应用程序崩溃

这样可以安全使用

let parsedObj = {}
try {parsedObj = JSON.parse(data);
} catch(e) {console.log("Cannot parse because data is not is proper json format")
}

#29楼

您可以简单地使用JSON.parse

JSON对象的定义是ECMAScript 5规范的一部分 。 node.js基于Google Chrome的V8引擎构建,该引擎遵循ECMA标准。 因此,node.js也具有全局对象JSON [docs]

注意JSON.parse可以占用当前线程,因为它是一种同步方法。 因此,如果您打算解析大型JSON对象,请使用流式JSON解析器。


#30楼

使用JSON对象 :

JSON.parse(str);

#31楼

您可以要求 .json文件。

var parsedJSON = require('./file-name');

例如,如果您在与源代码文件相同的目录中有一个config.json文件,则可以使用:

var config = require('./config.json');

或(可以省略文件扩展名):

var config = require('./config');

请注意, require同步的,并且只读取一次文件,以下调用从缓存返回结果

另请注意,只应在绝对控制下将其用于本地文件,因为它可能执行文件中的任何代码。

如何使用Node.js解析JSON?相关推荐

  1. JS解析json数据并将json字符串转化为数组的实现方法

    json数据在ajax实现异步交互时起到了很重要的作用,他可以返回请求的数据,然后利用客户端的js进行解析,这一点体现出js的强大,本文介绍JS解析json数据并将json字符串转化为数组的实现方法, ...

  2. js解析json数组+java对象转json字符串

    function checkoutUserlist(){ // js 解析json数组var statuslist = [{"isAvailabe":"1",& ...

  3. js解析json数据

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1. 一种为使用eval()函数. 2. 使用Function对象来进行返回解析 一.使用eval()函数 系统后台代码 /// & ...

  4. 通过Node.js解析stl文件

    通过Node.js解析stl文件 在此之前请确认已安装Node.js,已配置环境变量.如未安装与配置,请查看Node.js安装及环境配置(Windows) 一.下载Node项目文件 Node项目文件下 ...

  5. 使用JS解析JSON数组

    使用js解析json数组 <SCRIPT type= "text/javascript" > 1.如果是字符串则如下: var  jsonStr =  '[{" ...

  6. JS解析json数据(json字符串和数组之间相互转换)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  7. node.js 读取json文件

    node.js 读取json文件 效果图 目录结构 data.json index.htm app.js 学习资源推荐 效果图 目录结构 data.json [{"name": & ...

  8. html5处理json数据,js解析json数组

    js读取解析JSON类型数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 Jav ...

  9. Java、JS解析JSON对象、JSON数组

    一:三种JSON格式 基本类型 {"student": "张三","age": 18,"sex": true } 数组类 ...

最新文章

  1. C++利用cin输入时检测回车的方法
  2. JAVA实现查看详情功能_【JavaWeb】111:详情页面的实现
  3. 神经网络 测试集loss不下降_【NLP高频面试题】神经网络及其优化
  4. 博客系统知多少:揭秘那些不为人知的学问(二)
  5. Intel 64/x86_64/IA-32/x86处理器指令集 - CPUID (1) - 概述
  6. android层叠卡片特效_LINE生日贺卡功能升级 快来试试私人生日贺卡 气球祝福特效...
  7. Spring Boot Admin 2.3.1 发布,轻量的图形化监控工具
  8. C语言函数一章教学,c语言案例教程:函数教学讲义.ppt
  9. python图书馆座位预约系统毕业设计开题报告
  10. CSND博客几年没有登录了,终于找回密码来报个到!
  11. vue-video-player 一款vue的前端视频播放插件 支持m3u8
  12. Python实战之12306抢票
  13. [学习][记录] c++语言:从放弃到入门 <一> c++11新关键字以及引入的新特性
  14. 分布式统一框架的设计与实现(数据库)
  15. JAVA微信小程序医院预约挂号小程序系统毕业设计 开题报告
  16. centos7图形化分区和ks文件分区的配置
  17. MySQL技能树学习总结
  18. python多久可以完全学会_python好学吗自学要学多久
  19. 广州优漫动游公司:高级UI/UE交互设计就业班学什么?
  20. 如何用纯 CSS 实现优惠券效果

热门文章

  1. 教你如何玩转redis-简单消息队列
  2. python 提取网关信息_python:使用netifaces模块获取本机IP网关等信息
  3. PHP学习笔记-PHP与JavaScript的交互
  4. Spark-Scala算子
  5. (0107)iOS开发之UI实时调试InjectionIII的使用
  6. 鸿蒙武器排行榜,刺客伍六七武器排行榜,剪刀垫底,魔刀仅排第二,图四才是最强武器...
  7. python 倒计时_用Python帮你远离猝死悲剧
  8. wampserver环境配置局域网访问
  9. 视图函数中进行sql查询,防止sql注入
  10. 数据挖掘-数据清理过程