ESP32环境下ujson加载JSON文件报语法错误的问题咨询
问题原因
ujson.loads()抛出JSON语法错误的核心原因是你生成的riversss.txt不符合标准JSON语法规则,具体问题有两个:
- 根结构非法:标准JSON仅支持单个根节点,可以是对象、数组、字符串、数字、布尔值、null,不允许多个根节点并列存在。你的文件里直接连续拼接了3个独立数组
[{...}][{...}][{...}],数组之间没有合法分隔符,也没有被统一包裹到同一个外层数组中。解析器读取完第一个数组的闭合]后,直接遇到下一个数组的起始[,立刻触发语法错误。 - 字符串值存在冗余转义:所有时间字段的值被写成了
"\"2022-xx-xx xx:xx:xx\""格式,相当于字符串内容首尾额外带了双引号,这个问题不会直接触发当前报错,但读取后需要额外处理多余引号才能拿到正常的时间字符串。
修复方案
根源修复(推荐,从写入阶段解决问题)
你之前生成文件的逻辑有误,正确的做法是把所有待存储的字典统一放到同一个外层列表中,一次性调用ujson.dump()写入文件,不要每存一条数据就单独套一层数组写入。参考代码:
import ujson # 所有河流数据统一放到同一个外层列表 river_list = [ { "zjawisko_lodowe": "0", "temperatura_wody_data_pomiaru": "2022-06-23 05:10:00", "stan_wody": "521", "temperatura_wody": "17.54", "zjawisko_zarastania_data_pomiaru": "2018-11-21 10:57:00", "zjawisko_lodowe_data_pomiaru": "2020-01-24 08:00:00", "stan_wody_data_pomiaru": "2022-06-23 05:10:00", "stacja": "Ustka", "zjawisko_zarastania": "0", "id_stacji": "154160110", "rzeka": "Bałtyk", "województwo": "pomorskie" }, # 其余两个字典直接追加到当前列表即可,不需要单独包裹[] ] # 一次性写入文件 with open("riversss.txt", "w", encoding="utf-8") as f: ujson.dump(river_list, f)
写入完成后,你原来的读取代码就可以正常运行,不需要额外修改。
临时修复(适配已生成的错误文件)
如果不想重新生成文件,可以在读取阶段对原始内容做字符串修正,再交给ujson解析:
import ujson with open("riversss.txt", "r", encoding="utf-8") as f: raw = f.read() # 把多个独立数组合并为一个大数组 fixed_raw = "[" + raw.replace("][", ",") + "]" # 移除时间字符串里多余的转义双引号 fixed_raw = fixed_raw.replace('\\"', '') data = ujson.loads(fixed_raw)
注意:ESP32运行的是MicroPython环境,操作文件时优先使用
with上下文管理器自动释放文件句柄,读取带非ASCII字符(如文件中的波兰语特殊字符)的文件时,明确指定encoding="utf-8"可以避免乱码问题。
内容的提问来源于stack exchange,提问作者24beads
相关产品推荐
相关产品推荐

