将字符串化的json对象转换为json

问题描述 投票:0回答:2

我正在使用 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 而不会导致错误,但这是误报,不应该这样做。

python json mariadb
2个回答
0
投票

我不知道你为什么要将 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"]'}

0
投票

对于这个令人困惑的问题,我很抱歉,我没能清楚地表达出这个问题的目标是什么。 我想避免将字符串值转换为 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 对象,例如字典。

我知道这仍然可能会产生误报,但所有这些都取决于我的用例。我对此很满意,因为我想专注于字典,并避免转换不包含字典的字符串化整数和数组

© www.soinside.com 2019 - 2024. All rights reserved.