Python JSON изменяет одинарные кавычки на двойные, оставляя строковые кавычки в покое - PullRequest
0 голосов
/ 17 мая 2019

У нас есть следующий фрейм данных:

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 ]

1 голос
/ 17 мая 2019

Вот преобразование строки (с одинарным ') в dict.

import ast

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

output

{'a': 12, 'c': 'd'}
<type 'dict'>
1 голос
/ 17 мая 2019

Проблема не в функции, а в строке.Вы ввели \, чтобы заключить в кавычку одинарную кавычку, но это было бесполезно, потому что одиночный \ в строке заключает в кавычки следующий символ (здесь кавычка) и пропускает его в строке.Демонстрация:

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

В строке только что есть обратный слеш.

В любом случае вам не следует пытаться преобразовывать кавычки обычным способом.Из-за всех возможных угловых случаев вам придется создать выделенный (и сложный) парсер.Поэтому я советую вам просто вставить правильную строку JSON в ваш фрейм данных.

...