Python JSON将单引号更改为双引号,而不管字符串内的引号

时间:2019-05-17 14:37:11

标签: python json pandas quotes double-quotes

我们有以下数据框:

import pandas as pd
import numpy as np
import json
from json import JSONDecodeError

json_as_str_list = [
    "[{'key1': 312, 'name': 'Simple name'}]",
    "[{'key1': 981, 'name': 'Name n' quote'}]",
    np.nan
]
d = {'json_as_str': json_as_str_list}
df = pd.DataFrame(data=d)


    json_as_str
0   [{'key1': 312, 'name': 'Simple name'}]
1   [{'key1': 981, 'name': 'Name n' quote'}]
2   NaN

在导入json_as_str列之后是一个字符串列表,但我希望它是JSON对象列表。我编写了一个函数,该函数应返回给定字符串的空JSON对象的列表或给定np.nan的空列表:

 def convert_to_JSON_helper(json_str):
    if isinstance(json_str, str):
        json_str = json_str.replace("'", '"')
        try:
            return json.loads(json_str)
        except JSONDecodeError:
            print(json_str)
            return []
    else:
        return []

当前实现不处理字符串中的单引号(如数据框的第二行)。我应该如何修改该功能以使其按预期工作?

使用df['json_as_str'].apply(convert_to_JSON_helper)时获得的当前输出:

0    [{'key1': 312, 'name': 'Simple name'}]
1                                        []
2                                        []
Name: json_as_str, dtype: object

我想要的输出:

0    [{'key1': 312, 'name': 'Simple name'}]
1  [{'key1': 981, 'name': 'Name n' quote'}]
2                                        []
Name: json_as_str, dtype: object

2 个答案:

答案 0 :(得分:0)

问题不是函数,而是字符串。您键入了\来引用单引号,但是它毫无用处,因为字符串中的单个\引用了以下字符(此处是引号),然后将其放入字符串中。演示:

>>> a = " a 'b' 'c\'d' "
>>> a
" a 'b' 'c'd' "

反斜杠刚刚在字符串中被吃掉了。

无论如何,您都不应尝试以一般方式转换引号。由于所有可能的极端情况,您将必须构建一个专用(且复杂)的解析器。因此,我的建议是您应该在数据框中插入正确的JSON字符串。

答案 1 :(得分:0)

这是将字符串(带有单个')转换为字典。

import ast

data = ast.literal_eval("{'a' : 12, 'c' : 'd'}")
print(data)
print(type(data))

输出

{'a': 12, 'c': 'd'}
<type 'dict'>