Python JSON 将单引号更改为双引号 保留字符串内引号
Python JSON change single quotes to double quotes leave in-string quotes alone
我们有以下数据框:
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 对象列表。我写了一个函数,它应该 return 给定字符串的空 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
问题不在于函数,而在于字符串。您键入 \
来引用单引号,但它毫无用处,因为字符串中的单个 \ 引用了后面的字符(此处为引号)并将其放入字符串中。演示:
>>> a = " a 'b' 'c\'d' "
>>> a
" a 'b' 'c'd' "
字符串中的反斜杠刚刚被吃掉。
无论如何,您不应该尝试以一般方式转换引号。由于所有可能的极端情况,您将不得不构建一个专用的(且复杂的)解析器。所以我的建议是您应该在数据框中插入正确的 JSON 字符串。
这里是将字符串(带有单个')转换为字典。
import ast
data = ast.literal_eval("{'a' : 12, 'c' : 'd'}")
print(data)
print(type(data))
输出
{'a': 12, 'c': 'd'}
<type 'dict'>
我们有以下数据框:
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 对象列表。我写了一个函数,它应该 return 给定字符串的空 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
问题不在于函数,而在于字符串。您键入 \
来引用单引号,但它毫无用处,因为字符串中的单个 \ 引用了后面的字符(此处为引号)并将其放入字符串中。演示:
>>> a = " a 'b' 'c\'d' "
>>> a
" a 'b' 'c'd' "
字符串中的反斜杠刚刚被吃掉。
无论如何,您不应该尝试以一般方式转换引号。由于所有可能的极端情况,您将不得不构建一个专用的(且复杂的)解析器。所以我的建议是您应该在数据框中插入正确的 JSON 字符串。
这里是将字符串(带有单个')转换为字典。
import ast
data = ast.literal_eval("{'a' : 12, 'c' : 'd'}")
print(data)
print(type(data))
输出
{'a': 12, 'c': 'd'}
<type 'dict'>