как обновить значение json в fs, которое читается из fs в javascript?

Требование: чтение из файла json, обновление значения и запись в файл json

У меня есть файл json test.json, который содержит данные ниже

test.json

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

function.js // содержит функцию для чтения, обновляет значение json из fs

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, как показано ниже, они работают, но возникают проблемы при чтении из файловой системы.

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

person sridattas    schedule 30.06.2020    source источник


Ответы (1)


Вы заменяете data на каждой итерации на data[keyName[i]], что приведет к Edit (как вы описали).

Я рекомендую использовать небольшую вспомогательную библиотеку, например lodash, поскольку это позволяет довольно легко установить значения по определенному пути:

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')
person eol    schedule 30.06.2020
comment
Спасибо, и это полезно. Когда я включаю вышеупомянутое выражение для требования loadash, я вижу ошибку «Не могу найти модуль». Ошибка: не удается найти модуль lodash - person sridattas; 30.06.2020
comment
Да, сначала необходимо установить: npm i lodash - person eol; 30.06.2020
comment
Понял. Спасибо. Я думал, что это по умолчанию, например, fs, path. - person sridattas; 30.06.2020
comment
Эй, @sridattas, знаете ли вы что-нибудь, связанное с самостоятельной реализацией функции _.set ()? - person Diksha Goyal; 30.06.2020
comment
@DikshaGoyal Нет. Решение будет полезным. - person sridattas; 30.06.2020
comment
Вы можете проверить исходный код: см. github.com/lodash/lodash/blob / и github.com/lodash/lodash/blob.com/lodash/lodash/blob.com / - person eol; 30.06.2020