【问题标题】:Parse json data seperated by new line in Nodejs在Nodejs中解析由新行分隔的json数据
【发布时间】: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"}
  • 我已经更新了排序键顺序的答案。

标签: node.js json parsing


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多