【问题标题】:Parsing JSON output by splitting by some special character or character sequence通过某些特殊字符或字符序列拆分来解析 JSON 输出
【发布时间】:2016-03-03 13:47:37
【问题描述】:

一些日志库将 JSON 字符串写入文件,然后对其进行解析。 我正在编写一个用于集成测试的库,并且想知道拆分 JSON 字符串的最佳方法是什么,以便我可以创建一个字符串数组,然后一次解析它们。

这将是这样完成的:

var path = require('path');
var filePath = path.resolve(appRootPath + '/' + 'test/output/test1.txt');
var rstream = fs.createReadStream(filePath);

var data = '';

rstream
    .on('data', function (chunk) {
        data += chunk;
    })
    .on('end', function () {  // done
        var array = String(dataLength).split(';'); //spit the big string into an array of strings by some token

        doTheThing(array.filter(function (item) {   //filter and parse the array element by element
            return item && item.length > 0;
        }).map(function (item) {
            return JSON.parse(String(item));
        }));

    });

下面,我只是用分号作为描述字符,但是由于显而易见的原因,这还不够好。

所以我希望解析下面这个大字符串(请原谅“狗”和“猫”之类的无意义词):

{"testId":21,"desc":"cats 1"};{"testId":18,"desc":"dogs 1"};{"testId":1,"desc":"makes stuff 1","error":{}};{"testId":22,"desc":"cats 2"};{"testId":19,"desc":"dogs 2"};{"testId":2,"desc":"makes stuff 2","error":{}};{"testId":20,"tests":[{"testId":21,"type":"it-standard","desc":"cats 1","complete":false,"error":null},{"testId":22,"type":"it-standard","desc":"cats 2","complete":false,"error":null}],"testsParallel":[],"loopTests":[],"children":[],"error":null};{"testId":17,"tests":[{"testId":18,"type":"it-standard","desc":"dogs 1","complete":false,"error":null},{"testId":19,"type":"it-standard","desc":"dogs 2","complete":false,"error":null}],"testsParallel":[],"loopTests":[],"children":[{"testId":20}],"error":null};{"testId":3,"desc":"makes stuff 2","error":null};{"testId":4,"desc":"makes stuff 2","error":{}};{"testId":10,"desc":"makes stuff 1","error":{}};{"testId":11,"desc":"makes stuff 2","error":null};{"testId":12,"desc":"makes stuff 3","error":{}};{"testId":14,"desc":"makes stuff 44","error":{}};{"testId":15,"desc":"makes stuff 888","error":{}};{"testId":16,"desc":"makes stuff 999","error":{}};{"testId":6,"desc":"makes stuff chard","error":{}};{"testId":7,"desc":"makes stuff heeee","error":{}};{"testId":8,"desc":"makes stuff raaa","error":{}};{"testId":0,"tests":[{"testId":1,"type":"it-standard","desc":"makes stuff 1","complete":false,"error":null},{"testId":2,"type":"it-standard","desc":"makes stuff 2","complete":false,"error":null},{"testId":3,"type":"it-standard","desc":"makes stuff 2","complete":false,"error":null},{"testId":4,"type":"it-standard","desc":"makes stuff 2","complete":false,"error":null}],"testsParallel":[{"testId":9,"tests":[{"testId":10,"type":"it-parallel","desc":"makes stuff 1","complete":false,"error":null},{"testId":11,"type":"it-parallel","desc":"makes stuff 2","complete":false,"error":null},{"testId":12,"type":"it-parallel","desc":"makes stuff 3","complete":false,"error":null}],"type":"ParallelTestSet"},{"testId":13,"tests":[{"testId":14,"type":"it-parallel","desc":"makes stuff 44","complete":false,"error":null},{"testId":15,"type":"it-parallel","desc":"makes stuff 888","complete":false,"error":null},{"testId":16,"type":"it-parallel","desc":"makes stuff 999","complete":false,"error":null}],"type":"ParallelTestSet"}],"loopTests":[{"testId":5,"tests":[{"testId":6,"type":"it-loop","desc":"makes stuff chard","complete":false,"error":null},{"testId":7,"type":"it-loop","desc":"makes stuff heeee","complete":false,"error":null},{"testId":8,"type":"it-loop","desc":"makes stuff raaa","complete":false,"error":null}],"type":"LoopTestSet"}],"children":[{"testId":17}],"error":null};

我需要一种聪明的方法来用一些永远不会出现在输出中的特殊字符来描述可能的 JS 对象(我 可以 控制输出中的最终结果,但这可能需要我过滤最终存储在磁盘上的最终用户数据)。

这是怎么做到的?我可以使用一些超级特殊字符或字符序列吗?还是有一种我没有想到的“更聪明”的方法?

【问题讨论】:

  • 您是否可以将测试存储在数组中:[{},{},...,{}]?这将使您更轻松地进行解析,因为您可以使用内置方法来循环访问数据。
  • 是的,我想我可以这样做,我会一次解析整个事情,永远不会有那么多数据,所以应该没问题
  • 一般来说,每个日志条目都出现在日志文件中各自的行中,从而使系统的行分隔顺序(\n\r\r\n 等)成为分隔符.
  • 是的,我可能想要包含换行符,所以希望 JSON.parse 可以忽略这些,我很快就会发现,因为我不能盲目地将它们去掉,因为那样我会去掉输出本身的换行符
  • 你会想要使用阵列解决方案。如果不能保证任何给定的字符/序列不会出现在给定的测试定义中,我不知道您是否有替代方案。

标签: javascript json node.js fs


【解决方案1】:

使用 JSON.parse() 可以从字符串中创建对象。 也许可以这样尝试:

  • 将 JSON 文件读取为字符串

  • 将字符串拆分成数组:string.split(';');

  • 现在使用 JSON.parse 在循环中解析所有数组条目

或者只是在 JSON 文件中创建一个数组并解析这个完整的东西

【讨论】:

  • 感谢蒂姆,但这个问题是关于如何将不可解析的大字符串拆分为单独的可解析 JSON 字符串;如您所见,我的 OP 具​​有您指定的公式,但是一旦用户在输出中包含分号字符,它就会动摇
  • 你是对的。没有想过这个。制作一个数组,就像 bstockwell 说的那样。
猜你喜欢
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多