在Nodejs中解析由新行分隔的json数据

Posted

技术标签:

【中文标题】在Nodejs中解析由新行分隔的json数据【英文标题】:Parse json data seperated by new line in Nodejs 【发布时间】:2019-07-13 02:50:52 【问题描述】:

我一直在做一些项目,我必须处理由换行符分隔的 JSON 数据。这是数据的形状:

"response": "True", "controllerId": "2751", "level": "INFO", "logType": "watchdogResponse", "deviceId": "2751", "container": "firmware", "epoch": "1549996256", "module": "hostServices", "ts": "2019-02-13 00:00:56"
"ts": "2019-02-13 00:01:10", "epoch": "1549996270", "level": "INFO", "module": "jr", "logType": "running", "controllerId": "2751", "deviceId": "2751", "rid": "EXTERNAL CALL", "val": "1549996260000"
"ts": "2019-02-13 00:01:10", "epoch": "1549996270", "level": "INFO", "module": "applicationMain", "logType": "wifi", "controllerId": "2751", "deviceId": "2751", "networkStrength": "100.0"

现在我该如何解析它,我必须按它的键对数据进行排序。

【问题讨论】:

数据应该按什么键排序? 不是一个键,就像所有键都不是按顺序排列的,例如:a="1",b="2",c="3" b:"2", a="1",c="3" 我想要的是文件变成这样: a="1",b="2",c="3" a="1",b="2 ",c="3" 我已经更新了排序键顺序的答案。 【参考方案1】:

如果我理解正确,数据不是有效的 JSON 字符串,而是由换行符分隔的 JSON 字符串。这就是data 可以转换为具有排序键顺序的对象数组的方式:

'use strict';

const data =
`"response": "True", "controllerId": "2751", "level": "INFO", "logType": "watchdogResponse", "deviceId": "2751", "container": "firmware", "epoch": "1549996256", "module": "hostServices", "ts": "2019-02-13 00:00:56"
"ts": "2019-02-13 00:01:10", "epoch": "1549996270", "level": "INFO", "module": "jr", "logType": "running", "controllerId": "2751", "deviceId": "2751", "rid": "EXTERNAL CALL", "val": "1549996260000"
"ts": "2019-02-13 00:01:10", "epoch": "1549996270", "level": "INFO", "module": "applicationMain", "logType": "wifi", "controllerId": "2751", "deviceId": "2751", "networkStrength": "100.0"`;

const sortedArrayOfObjects = data
  .split('\n')
  .map(JSON.parse)
  .map(obj => Object.entries(obj).sort().reduce(
    (o, [k, v]) => (o[k] = v, o), )
  );

console.log(sortedArrayOfObjects);

【讨论】:

我想处理所有关键值,而不仅仅是“ts”。你能帮我把无效的 JSON 文件转换成正确的 JSON 文件吗 你可以试试这个:const validJSON = '[' + data.replace(/\n+(?=\)/g, ',\n') + ']';。然后就可以解析了:const arrayOfObjects = JSON.parse(validJSON); const validJSON = data.replace(/\n+(?=\)/g, ',\n'); ^ 类型错误:无法读取未定义的属性“替换”【参考方案2】:

您可以使用JSON.parse() 将 JSON 解析为 javascript 对象。要按字典顺序按键对数据进行排序,您可以使用Object.entries() 创建一个数组,然后使用array's sort() method 对其进行排序。

let obj = JSON.parse(data)
let arr = Object.entries(obj).sort()

其中arr 将是一个数组,其中包含按其键排序的键值对(作为数组)。

【讨论】:

【参考方案3】:

假设您想使用日期进行排序。

let input = `"response": "True", "controllerId": "2751", "level": "INFO", "logType": "watchdogResponse", "deviceId": "2751", "container": "firmware", "epoch": "1549996256", "module": "hostServices", "ts": "2019-02-13 00:00:56"
"ts": "2019-02-13 00:01:10", "epoch": "1549996270", "level": "INFO", "module": "jr", "logType": "running", "controllerId": "2751", "deviceId": "2751", "rid": "EXTERNAL CALL", "val": "1549996260000"
"ts": "2019-02-13 00:01:10", "epoch": "1549996270", "level": "INFO", "module": "applicationMain", "logType": "wifi", "controllerId": "2751", "deviceId": "2751", "networkStrength": "100.0"`

let out = input.split('\n').map(JSON.parse).sort((a, b) => 
  new Date(a.ts) > new Date(b.ts);
)
console.log(out);

【讨论】:

不幸的是,这样的排序函数总是返回undefined。即使使用明确的return,它也会返回truefalse,而不是必需的-110

以上是关于在Nodejs中解析由新行分隔的json数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在nodejs json2csv中的现有csv文件中追加新行?

Web04 Ajax

如何将 JSON 文件转换为使用 Google Apps 脚本分隔的新行?

Unity 解析Json格式

C# 解析JSON格式数据

Nodejs - 将制表符分隔文件编写为 json 对象