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
相关产品推荐
相关产品推荐

