【问题标题】:Nodejs Convert text to JSONNodejs 将文本转换为 JSON
【发布时间】:2021-09-30 14:39:32
【问题描述】:

由于某种原因,我很难将此 txt 文件转换为实际的 javascript 数组。

myJson.txt

{"action": "key press", "timestamp": 1523783621, "user": "neovim"}
{"action": "unlike", "timestamp": 1523784584, "user": "r00k"}
{"action": "touch", "timestamp": 1523784963, "user": "eevee"}
{"action": "report as spam", "timestamp": 1523786005, "user": "moxie"}

目前我所拥有的不起作用

const fs = require('fs');

function convert(input_file_path) {
    const file = fs.readFileSync(input_file_path, 'utf8');
    const newFormat = file
      .replace(/(\r\n\t|\n|\r\t)/gm,'')
      .replace(/}{/g, '},{');

    console.log([JSON.parse(newFormat)]);
}

convert('myJson.txt');

【问题讨论】:

  • 你不能循环遍历它并以 [key: value, key: value,...] 的格式保存它
  • 您的预期结果是什么? [{ action: ...}, { action: ...}]?
  • @MarcosCasagrande 是的,请。我对此感到非常沮丧,这让我很生气..lol
  • 可能是因为输入的数据不是数组形式?
  • 大括号表示一个对象,您正在查看数组,两种不同的数据类型。 (数组使用方括号)

标签: javascript node.js


【解决方案1】:

由于您的文件每行包含一个 JSON 对象,您可以使用 readline 逐行读取该文件。

然后解析每一行,并推入一个数组,然后在文件被完全读取后返回(解析)。

'use strict';

const fs = require('fs');
const readline = require('readline');

function convert(file) {

    return new Promise((resolve, reject) => {

        const stream = fs.createReadStream(file);
        // Handle stream error (IE: file not found)
        stream.on('error', reject);

        const reader = readline.createInterface({
            input: stream
        });

        const array = [];

        reader.on('line', line => {
            array.push(JSON.parse(line));
        });

        reader.on('close', () => resolve(array));
    });
}


convert('myJson.txt')
    .then(res => {
        console.log(res);
    })
    .catch(err => console.error(err));

【讨论】:

    【解决方案2】:

    我会这样做

    var fs = require('fs');
    var readline = require('readline');
    var array = [];
    var input = null;
    var rd = readline.createInterface({
        input: fs.createReadStream(__dirname+'/demo.txt')
        
    });
    
    rd.on('line', function(line) {
        array.push(JSON.parse(line));
    });
    rd.on('close', function(d){
      array.forEach(e=>console.log(e.action))
    })

    这里发生的是,我正在使用readline 逐行读取文件的行,这是nodejs 的核心模块之一。监听事件并做需要的事情。

    是的,你必须将这一行解析为JSON ;)

    谢谢

    【讨论】:

      【解决方案3】:

      您的代码的问题是您试图将 JS 数组解析为 JSON 数组。而 JSON 数组字符串应该只是字符串。

      这是你想要做的:

      jsArray = ['{"foo": "bar"}, {"foo":"baz"}']
      

      这是一个有效的 JS 数组,包含单个字符串值 '{"foo": "bar"}, {"foo":"baz"}'。

      同时

      jsonArrayStr = '["{"foo": "bar"}, {"foo":"baz"}"]' 
      

      这是一个有效的 JSON 数组字符串(因为方括号是字符串的一部分)。

      为了让您的代码运行,您需要在解析之前将方括号添加到您的字符串。

      function convert(input_file_path) {
          const file = fs.readFileSync(input_file_path, 'utf8');
          const newFormat = file
            .replace("{", "[{")
            .replace(/}$/, "}]")
      
          console.log(JSON.parse('[' + newFormat + ']'));
      }
      

      【讨论】:

        【解决方案4】:

        我在脚本中所做的是逐行读取文本文件的内容并将其存储到数组中,同时将其转换为 JSON 对象。当我们到达最后一行并且我们的 JSON 数组/对象包含所有数据时。现在您可以在使用JSON.stringify() 将 JSON 对象转换为字符串后将此对象写入新文件 fs.writeFileSync()

        注意:- 你必须安装 Line reader 包,即npm install line-reader

        var lineReader = require('line-reader');
        var fs = require('fs')
        
        var jsonObj = {};
        var obj = [];
        var file = "fileName.json"
        var num= 0;
        
        lineRead();
        async function lineRead(){
        lineReader.eachLine('input.txt', function(line, last) {
        // to check on which line we're.
              console.log(num);
              num++;
              convertJson(line)
        
              if(last){
        //when it's last line we convert json obj to string and save it to new file.
                var data = JSON.stringify(obj)
                fs.writeFileSync(file,data);
        
              }
        });
        }
        
        function convertJson(data){
                var currentVal = data
                var value = JSON.parse(data)
                var temp = value;
        //storing the value in json object
                jsonObj = value;
                obj.push(jsonObj);
            }
          
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-09
          • 2015-04-01
          • 1970-01-01
          • 2017-07-11
          • 1970-01-01
          相关资源
          最近更新 更多