我正在使用 MariaDB,不幸的是,JSON 对象以字符串形式返回。我想将这些字符串化的 JSON 对象转换回 JSON,但问题是 - 我只想在它们实际上是 JSON 对象时才这样做,并忽略所有字段,例如,只是普通字符串(但 can 转换为JSON 不会导致错误)。
我的方法是检查字符串是否包含双引号,但这似乎有点太天真,因为它还会转换一个自然包含双引号的字符串,但并不打算作为 JSON目的。有没有更稳健的方法来实现这一目标?
import json
results = {"not_string": 1234,
"not_json": "1234",
"json": '[{"json": "1234"}]',
"false_positive": '["actually a quote in brackets"]'}
# load the json fields in the results
for key, value in results.items():
if isinstance(value, str) and '"' in value:
try:
results[key] = json.loads(value)
except Exception as e:
pass
for key, value in results.items():
print(type(value))
<class 'int'>
<class 'str'>
<class 'list'>
<class 'list'> <--
预期:
<class 'int'>
<class 'str'>
<class 'list'>
<class 'str'> <--
基本上,我不想依赖“请求宽恕”,因为字符串可以转换为 JSON 而不会导致错误,但这是误报,不应该这样做。
我不知道你为什么要将 false_positive 转换为字符串,这是一个有效的列表。在这里,我提供了一个解决方案,其中所有具有单个字符串值的列表都将转换为字符串。试试这个代码:
import json
results = {"not_string": 1234,
"not_json": "1234",
"json": '[{"json": "1234"}]',
"false_positive": '["actually a quote in brackets"]'}
# load the json fields in the results
for key, value in results.items():
if isinstance(value, str) and '"' in value:
try:
temp = json.loads(value)
if isinstance(temp, list):
if len(temp) == 1 and isinstance(temp[0], str):
results[key] = json.dumps(temp)
else:
results[key] = temp
except Exception as e:
pass
for key, value in results.items():
print(type(value))
print(results)
这是输出:
<class 'int'>
<class 'str'>
<class 'list'>
<class 'str'>
{'not_string': 1234, 'not_json': '1234', 'json': [{'json': '1234'}], 'false_positive': '["actually a quote in brackets"]'}
对于这个令人困惑的问题,我很抱歉,我没能清楚地表达出这个问题的目标是什么。 我想避免将字符串值转换为 json,即使它们能够成功转换。
例如,我不想将一串数字(“1234”)转换为json,但我do想要将json对象(例如字典或字典数组)转换为json。
我想出的是这样的:
此类 json 对象至少包含一个双引号(我已经在问题中定义了这一点)
但是,它们还必须包含偶数个双引号
而且,它们还应该包含至少一个冒号 -> :
我已经扩展了代码是否应根据这些定义转换为 json 的检查:
if isinstance(value, str) and value.count('"') % 2 == 0 and value.count('"') > 0 and ":" in value:
try:
value = json.loads(value)
except Exception as e:
# do not change the value
pass
这避免了转换本来应该保留字符串的字符串,并专注于转换更复杂的 json 对象,例如字典。
我知道这仍然可能会产生误报,但所有这些都取决于我的用例。我对此很满意,因为我想专注于字典,并避免转换不包含字典的字符串化整数和数组