Одиночные и двойные кавычки в JSON - PullRequest
86 голосов
/ 12 ноября 2010

Мой код:

import simplejson as json

s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)

#1 определение неверно

#2 определение верно

Я слышал, что в Python одинарная и двойная цитата может быть взаимозаменяемой.Кто-нибудь может мне это объяснить?

Ответы [ 8 ]

140 голосов
/ 12 ноября 2010

Синтаксис JSON не является синтаксисом Python.JSON требует двойных кавычек для своих строк.

95 голосов
/ 16 января 2014

вы можете использовать ast.literal_eval()

>>> import ast
>>> s = "{'username':'dfdsfdsf'}"
>>> ast.literal_eval(s)
{'username': 'dfdsfdsf'}
39 голосов
/ 03 января 2012

Вы можете записать JSON с двойной кавычкой:

import json

# mixing single and double quotes
data = {'jsonKey': 'jsonValue',"title": "hello world"}

# get string with all double quotes
json_string = json.dumps(data) 
10 голосов
/ 18 января 2016

demjson также является хорошим пакетом для решения проблемы неправильного синтаксиса JSON:

pip install demjson

Использование:

from demjson import decode
bad_json = "{'username':'dfdsfdsf'}"
python_dict = decode(bad_json)

Редактировать:

demjson.decode - отличный инструмент для поврежденных json, но когда вы имеете дело с большим количеством данных json, ast.literal_eval - лучшее совпадение и намного быстрее.

2 голосов
/ 17 августа 2017

Как уже говорилось, JSON не является синтаксисом Python.Вам нужно использовать двойные кавычки в JSON.Его создатель (не известен) использованием строгих подмножеств допустимого синтаксиса для облегчения когнитивной перегрузки программиста.


Ниже может произойти сбой, если одна из строк JSON сама содержит одну кавычкукак указано @Jiaaro.НЕ ИСПОЛЬЗОВАТЬ.Оставленный здесь пример того, что не работает.

действительно полезно знать, что в строке JSON нет одинарных кавычек.Скажем, вы скопировали и вставили его из консоли браузера / что угодно.Затем вы можете просто набрать

a = json.loads('very_long_json_string_pasted_here')

В противном случае это может сломаться, если использовать тоже одинарные кавычки.

1 голос
/ 05 октября 2018

Недавно я столкнулся с очень похожей проблемой и считаю, что мое решение будет работать и для вас.У меня был текстовый файл, который содержал список элементов в форме:

["first item", 'the "Second" item', "thi'rd", 'some \\"hellish\\" \'quoted" item']

Я хотел разобрать вышеизложенное в список Python, но не увлекался eval (), так как не мог доверять вводу,Сначала я попытался использовать JSON, но он принимает только элементы в двойных кавычках, поэтому я написал свой собственный очень простой лексер для этого конкретного случая (просто подключите свой собственный "stringtoparse", и вы получите в качестве выходного списка: 'items')

#This lexer takes a JSON-like 'array' string and converts single-quoted array items into escaped double-quoted items,
#then puts the 'array' into a python list
#Issues such as  ["item 1", '","item 2 including those double quotes":"', "item 3"] are resolved with this lexer
items = []      #List of lexed items
item = ""       #Current item container
dq = True       #Double-quotes active (False->single quotes active)
bs = 0          #backslash counter
in_item = False #True if currently lexing an item within the quotes (False if outside the quotes; ie comma and whitespace)
for c in stringtoparse[1:-1]:   #Assuming encasement by brackets
    if c=="\\": #if there are backslashes, count them! Odd numbers escape the quotes...
        bs = bs + 1
        continue                    
    if (dq and c=='"') or (not dq and c=="'"):  #quote matched at start/end of an item
        if bs & 1==1:   #if escaped quote, ignore as it must be part of the item
            continue
        else:   #not escaped quote - toggle in_item
            in_item = not in_item
            if item!="":            #if item not empty, we must be at the end
                items += [item]     #so add it to the list of items
                item = ""           #and reset for the next item
            continue                
    if not in_item: #toggle of single/double quotes to enclose items
        if dq and c=="'":
            dq = False
            in_item = True
        elif not dq and c=='"':
            dq = True
            in_item = True
        continue
    if in_item: #character is part of an item, append it to the item
        if not dq and c=='"':           #if we are using single quotes
            item += bs * "\\" + "\""    #escape double quotes for JSON
        else:
            item += bs * "\\" + c
        bs = 0
        continue

Надеюсь, это кому-нибудь пригодится.Наслаждайтесь!

0 голосов
/ 13 декабря 2018
import ast 
answer = subprocess.check_output(PYTHON_ + command, shell=True).strip()
    print(ast.literal_eval(answer.decode(UTF_)))

У меня работает

0 голосов
/ 20 октября 2016
import json
data = json.dumps(list)
print(data)

Приведенный выше фрагмент кода должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...