【问题标题】:how to update json value in fs which is read from fs in javascript?如何更新从 javascript 中的 fs 读取的 fs 中的 json 值?
【发布时间】:2020-10-20 17:10:23
【问题描述】:

要求:从json文件中读取,更新值并写入json文件

我有一个 json 文件 test.json,其中包含以下数据

test.json

{
    "login": "readfromjson",
    "pwd": "pwd",
    "taskName": "task",
   
    "selectors": [
        {
            "Edit": "Edit",
            "Complete": "Complete",
            "Review": "Review"
        }
    ]
}

function.js //包含从fs读取、更新json值的函数

function writeToJsonKey(fileName, keyName, value){
    let fullpath = PATH.resolve(GETPATH, fileName);
    let rawdata = FS.readFileSync(fullpath,'utf8');
    console.log(rawdata) //returns data as per json and is of string type
    
    let data = JSON.parse(rawdata); 
    console.log(rawdata) //returns [object Object]
    
    var i;
    keyName = keyName.split('.');
    for (i = 0; i < keyName.length; i++)
    {           
        data = data[keyName[i]];            
    }   
    data[keyName[i]] = value;

    console.log(keyName[i]) //returns required key where update to be done
    console.log(data[keyName[i]]) //returns undefined??
    
    FS.writeFileSync(fullpath, JSON.stringify(data, null, 2), function (err) { 
        if (err) throw err;
        console.log('Saved!');
      });
}

函数调用

writeToJsonKey('data.json', 'selectors.0.Edit', 'updated value') 

结果: 如console.log所示,json的全部数据被'Edit'替换。

注意:如果我像下面这样读取 json 数据,它可以工作,但从 fs 读取时会出现问题。

var obj = {
        "login": "readfromjson",
        "pwd": "pwd",
        "taskName": "task",
       
        "selectors": [
            {
                "Edit": "Edit",
                "Complete": "Complete",
                "Review": "Review"
            }
        ]
    }

【问题讨论】:

    标签: javascript node.js json fs


    【解决方案1】:

    您将在每次迭代中将data 替换为data[keyName[i]],这将导致Edit(如您所述)。

    我建议使用像 lodash 这样的小助手库,因为这允许 setting values 在特定路径上很容易:

    const lodash = require('lodash');
    
    function writeToJsonKey(fileName, keyName, value){
        let fullpath = PATH.resolve(GETPATH, fileName);
        let rawdata = FS.readFileSync(fullpath,'utf8');
        console.log(rawdata) //returns data as per json and is of string type
        
        const data = JSON.parse(rawdata); 
        lodash.set(data, keyName, value );
      
        
        FS.writeFileSync(fullpath, JSON.stringify(data, null, 2), function (err) { 
            if (err) throw err;
            console.log('Saved!');
          });
    }
    

    然后你可以调用这个函数:

    writeToJsonKey('/path/to/file',  'selectors[0].Edit', 'updated value')
    

    【讨论】:

    • 感谢您的帮助。当我包含上述语句以要求 loadash 时,我看到找不到模块错误。错误:找不到模块“lodash”
    • 是的,需要先安装:npm i lodash
    • 知道了,谢谢。我认为它是像 fs, path 一样的默认值。
    • 嘿,@sridattas 你知道任何与自我实现函数 _.set() 相关的事情吗?
    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2020-09-02
    • 2021-05-04
    • 1970-01-01
    • 2016-11-27
    • 2021-03-30
    相关资源
    最近更新 更多