使用node.js从json文件读取值

xyhw6mcr  于 2023-03-22  发布在  Node.js
关注(0)|答案(2)|浏览(172)

我是node.js的新手,有点困在这里。

[ {
    "key": "key1",
    "value": "value1"
  },   
  {
    "key": "key2",
    "value": "value2"
  } 
]

对于一个特定的键,我需要得到值。

function filterValue() {
  const category = {};
  category.filter = "key1" //this is not static value. This changes dynamically
  category.value = //Need to read the keyValue.json file and pick the value for key1 - which is value1
  return category;
}

如何在node.js中实现这一点?感谢您的帮助。

62lalag4

62lalag41#

我假设你已经把json解析成了一个变量。所以我的例子将使用这个:

const data = [ 
  {
    key: "key1",
    value: "value1"
  },   
  {
    key: "key2",
    value: "value2"
  } 
];

如果没有,那么在节点中,只要它是静态文件,我们就可以只需要它。但是,这将在应用程序的执行范围内加载一次。

const data = require('./file.json');

如果因为某些原因而需要动态读取它,那么你需要使用fs(总是在node中异步执行)。

const fs = require('fs');

fs.readFile('./file.json', 'utf8', function(err, contents) {
    if (err) {
      // we have a problem because the Error object was returned
    } else {
      const data = JSON.parse(contents);
      ... use the data object here ...
    }
});

如果你更喜欢Promises而不是回调:

const fs = require('fs');

// ES7 Version
const getJsonFile = (filePath, encoding = 'utf8') => (
   new Promise((resolve, reject) => {
      fs.readFile(filePath, encoding, (err, contents) => {
          if(err) {
             return reject(err);
          }
          resolve(contents);
      });
   })
     .then(JSON.parse)
);

// ES6 Version
const getJsonFile = function getJsonFile(filePath, encoding = 'utf8') {
   return new Promise(function getJsonFileImpl(resolve, reject) {
      fs.readFile(filePath, encoding, function readFileCallback(err, contents) {
          if(err) {
             return reject(err);
          }
          resolve(contents);
      });
   })
     .then(JSON.parse);
};

现在,有了这两种方法中的任何一种,您都可以简单地使用Promise

getJsonFile('./file.json').then(function (data) { ... do work });

或者如果使用异步

const data = await getJsonFile('./file.json');

所以现在我们需要一个可组合的过滤器来使用Array的find方法。在最新版本的Node(Carbon及以上版本)中:

const keyFilter = (key) => (item) => (item.key === key);

如果您是node6或更低版本的用户,请使用旧方法

const keyFilter = function keyFilter(key) {
   return function keyFilterMethod(item) {
      return item.key === key;
   }
};

现在我们可以在数组上使用这个过滤器,随时改变我们正在寻找的键(因为它是可组合的)。

const requestedItem = data.find(keyFilter('key2');

如果键不存在,将返回undefined,否则,我们有对象。

const requestedValue = requestedItem ? requestedItem.value : null;

此筛选器还可用于Array中的其他搜索,例如查找索引

const index = data.findIndex(keyFilter('key2'));

如果允许“key”在数组中重复,则可以使用filter将它们全部抓取

const items = data.filter(keyFilter('key2'));

综上所述,我们可能会将我们关注的领域放在不同的文件中。所以可能是getJsonFile.js和keyFilter.js,所以现在放在一起,我们会看起来像这样(将此文件称为readKeyFromFile):

const getJsonFile = require('./getJsonFile');
const keyFilter = require('./keyFilter');

module.exports = async (filePath, keyName) => {
   const json = await getJsonFile(filePath);
   const item = json.find(keyFilter(keyName));
   return item ? item.value : undefined;
};

我们的消费者

const readKeyFromFile = require('./readKeyFromFile');

readKeyFromFile('./file.json', 'key2').then((value) => {
   console.log(value);
};

一旦理解了这些基本原理,你就可以有很多组合来做到这一点。所以,玩得开心点。:)

m3eecexj

m3eecexj2#

如果你有一个名为keyValue的json对象,首先导入它并将其命名为keyValue,然后尝试这样做,

`function filterValue(req, res, next) {
   keyValue
      .find({ key: "key1" })
      .exec()
      .then(result= > {
         return result.value
      })  
}`

相关问题