【问题标题】:Python JSON change single quotes to double quotes leave in-string quotes alonePython JSON将单引号更改为双引号单独保留字符串引号
【发布时间】:2019-10-04 22:02:03
【问题描述】:

我们有以下数据框:

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

【问题讨论】:

    标签: python json pandas quotes double-quotes


    【解决方案1】:

    问题不在于函数,而在于字符串。您输入了 \ 来引用单引号,但这完全没用,因为字符串中的单个 \ 引用了以下字符(此处为引号)并将其放在字符串中。演示:

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

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

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

    【讨论】:

    • 感谢您的评论。当然,在创建示例时是错误的。问题是 JSON 字符串按照我的描述给出(反斜杠除外),我必须找到一种方法将单引号更改为双引号。
    【解决方案2】:

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

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

    输出

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

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      相关资源
      最近更新 更多