You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中解析换行分隔JSON数据并按键排序的方法

如何解析换行符分隔的JSON数据并按键排序?

问题描述

我正在开展一个项目,需要处理以换行符分隔的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"}

解决方案(Python示例)

处理这类数据可以分为三个核心步骤:分割数据为单个JSON字符串、解析JSON为字典、按键排序字典。下面是完整的可运行代码:

import json

# 假设这是你读取到的原始数据字符串(也可以从文件读取,比如用open().read())
raw_json_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"}'''

# 步骤1:按换行符分割,过滤掉空行和无效内容
individual_json_strings = [line.strip() for line in raw_json_data.split('\n') if line.strip()]

# 步骤2:解析每个JSON并按键排序
sorted_results = []
for json_str in individual_json_strings:
    try:
        # 把JSON字符串转成Python字典
        data_dict = json.loads(json_str)
        # 按键的字母顺序排序键值对,生成有序字典(Python3.7+原生字典保留插入顺序)
        sorted_dict = dict(sorted(data_dict.items()))
        sorted_results.append(sorted_dict)
    except json.JSONDecodeError as err:
        print(f"解析JSON失败,错误信息: {err}")

# 输出排序后的结果(格式化后更易读)
for item in sorted_results:
    print(json.dumps(item, indent=2))

代码说明

  • 分割数据:用split('\n')把原始数据拆分成单个JSON字符串,同时用列表推导式过滤掉空行,避免解析错误。
  • 解析JSON:json.loads()是Python标准库中解析JSON字符串的核心方法,会把字符串转成可操作的字典。
  • 按键排序:sorted(data_dict.items())会对字典的键值对按键的字母顺序排序,之后用dict()转成有序字典(Python3.7及以上版本的字典默认保留插入顺序,所以排序后的键顺序会被保留)。
  • 错误处理:加入了try-except块捕获解析错误,避免单个无效JSON导致整个程序崩溃。

扩展:如果是JavaScript环境

如果你需要在JavaScript中处理这类数据,也可以用类似的逻辑:

// 原始数据字符串
const rawData = `{"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 sortedResults = rawData.split('\n')
  .filter(line => line.trim())
  .map(line => {
    const obj = JSON.parse(line);
    // 按键排序生成新对象
    return Object.keys(obj).sort().reduce((acc, key) => {
      acc[key] = obj[key];
      return acc;
    }, {});
  });

// 输出结果
console.log(JSON.stringify(sortedResults, null, 2));

内容的提问来源于stack exchange,提问作者Bharat Arya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:49:04