在 python 中处理 json.loads() 值错误

Posted

技术标签:

【中文标题】在 python 中处理 json.loads() 值错误【英文标题】:Handling json.loads() Value Error in python 【发布时间】:2021-01-18 18:29:06 【问题描述】:

当我尝试运行此代码时遇到错误。

import ujson as json

input = '"a":NaN'
print(json.loads(input))

错误

print(json.loads(input))
ValueError: Expected object or value

我浏览了一些博客,发现 ujson 在执行json.loads 操作时不会处理nanNaN 值。

我的最终目标: 我想要

    使用ujson将字符串加载到JSON-FORMAT中 处理这种类型的 VALUE ERRORS 将输入字符串加载到 JSON 中

注意:我的输入可能是嵌套的 json 结构

input = "name":"siva","details":"id":"111","qualification":nan,"marks":["grade1":90,"grade2":null,"grade3":NaN]

预期输出

"a":NaN
"name":"siva","details":"id":"111","qualification":nan,"marks":["grade1":90,"grade2":null,"grade3":NaN]


谁能为此提出解决方案?

【问题讨论】:

为什么不使用json 而不是ujson?它适用于你的例子 解析json时不能处理值错误。它要么完全正确,要么有错误。如果你想检测无效值,你必须自己做。您的意思是:'input = '"a":null'。 ? @SpiderPig1297, ujsonjson 快,这就是为什么我要使用ujson 顺便说一句,不要使用input作为变量名 【参考方案1】:

我不确定您寻求的预期输出是什么(如果您也可以添加它会很棒)。

以下代码将执行而不会出现任何错误:

import json
import re

in1 = '"Number": nan'
in1 = re.sub(r'\bnan\b', 'NaN', in1)
print(json.loads(in1))
# 'Number': nan
in2 = '"name":"siva","details":"id":"111","qualification":nan,"marks":["grade1":90,"grade2":null,"grade3":NaN]'
in2 = re.sub(r'\bnan\b', 'NaN', in2)
print(json.loads(in2))
# 'name': 'siva', 'details': 'id': '111', 'qualification': nan, 'marks': ['grade1': 90, 'grade2': None, 'grade3': nan]

【讨论】:

我只想按原样提取 JSON-STRING。供您参考,我添加了示例输出。请检查一下。 @siva 您无法获得所需的输出,但使用json 您将能够尽可能接近它,但您仍然需要使用re.sub 来更改nan,因为它只识别NaN【参考方案2】:

NaN 不是有效的 JSON 符号,请参阅 http://json.org/ 的规范 ujson 不支持 nan/inf 的加载。请参阅https://github.com/ultrajson/ultrajson/issues/146 了解更多信息

在我看来,用null 替换nan 很容易出错。 使用标准库中的json。这是relevant part of the docs的链接

【讨论】:

标准json 库句柄是nan 还是NaN 值? 是的 - 检查docs【参考方案3】:

最好的选择是使用 jsonpickle 正确序列化 numpy 值。

import jsonpickle
import jsonpickle.ext.numpy as jsonpickle_numpy
jsonpickle_numpy.register_handlers()

with open('file.json', 'wb') as _file:
    _file.write(jsonpickle.encode(pairs).encode())

with open('file.json', 'rb') as _file:
    unpacked = jsonpickle.decode(_file.read())

【讨论】:

以上是关于在 python 中处理 json.loads() 值错误的主要内容,如果未能解决你的问题,请参考以下文章

python中json文件处理涉及的四个函数json.dumps()和json.loads()json.dump()和json.load()的区分

python中json文件处理涉及的四个函数json.dumps()和json.loads()json.dump()和json.load()的区分

Python中json文件处理的四个函数json.dumps()json.loads()json.dump()和json.load()的区分

python 读写json文件(dump, load),以及对json格式的数据处理(dumps, loads)

python 读写json文件(dump, load),以及对json格式的数据处理(dumps, loads)

python——json.loads避坑