Meu código:
import simplejson as json
s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)
#1
definição está errada
#2
definição está certa
Ouvi dizer que no Python essas aspas simples e duplas podem ser intercambiáveis. Alguém pode me explicar isso?
str(dict)
e não queroeval
. Um simples.replace("'", '"')
deve resolver o problema.json.dumps(..)
duas vezes como em: oimport json; d = dict(tags=["dog", "cat", "mouse"]); print json.dumps(json.dumps(d))
que dá:"{\"tags\": [\"dog\", \"cat\", \"mouse\"]}"
você pode usar
ast.literal_eval()
fonte
{ 'a' : 'this "string" really isn\'t!!!!' }
"{'link':'<a href="mylink">http://my.com</a>'}"
? Nesse caso,ast.literal_eval
gera um erro de sintaxeVocê pode descartar JSON com aspas duplas:
fonte
demjson também é um bom pacote para resolver o problema de sintaxe json inválida:
Uso:
Editar:
fonte
demjson.decode
é uma ótima ferramenta para json danificado - mas para tarefas que envolvem dezenas ou centenas de milhares de pacotes json,ast.literal_eval
é muito mais rápido. Para não dizerdemjson
que não tem o seu lugar: eu o uso como fallback caso métodos mais rápidos falhem.Dois problemas com as respostas dadas até agora, se, por exemplo, um transmitir tal JSON não padrão. Porque então pode ser necessário interpretar uma string de entrada (não um dicionário python).
Problema 1 -
demjson
: Com Python 3.7. + E usando conda, não consegui instalar o demjson, pois obviamente ele não oferece suporte a Python> 3.5 atualmente. Portanto, preciso de uma solução com meios mais simples, por exemploast
e / oujson.dumps
.Problema 2 -
ast
&json.dumps
: Se um JSON tem aspas simples e contém uma string em pelo menos um valor, que por sua vez contém aspas simples, a única solução simples, porém prática, que encontrei é aplicar ambos:No exemplo a seguir, supomos que
line
seja o objeto de string JSON de entrada:Etapa 1: converta a string de entrada em um dicionário usando a
ast.literal_eval()
Etapa 2: aplique
json.dumps
a ela para a conversão confiável de chaves e valores, mas sem tocar no conteúdo dos valores :json.dumps
sozinho não faria o trabalho porque não interpreta o JSON, mas apenas vê a string. Semelhante paraast.literal_eval()
: embora interprete corretamente o JSON (dicionário), ele não converte o que precisamos.fonte
Você pode consertar assim:
fonte
Como disse, JSON não é sintaxe Python. Você precisa usar aspas duplas em JSON. Seu criador é (in) famoso por usar subconjuntos estritos de sintaxe permitida para facilitar a sobrecarga cognitiva do programador.
Abaixo pode falhar se uma das strings JSON contiver uma aspa simples, conforme apontado por @Jiaaro. NÃO USE. Deixado aqui como exemplo do que não funciona.
É muito útil saber que não há aspas simples em uma string JSON. Digamos, você copiou e colou de um console de navegador / qualquer coisa. Então, você pode simplesmente digitar
Caso contrário, isso poderia falhar se também usasse aspas simples.
fonte
{"key": "value 'with' single quotes"}
Ele realmente resolveu meu problema usando a função eval.
fonte
Recentemente me deparei com um problema muito semelhante e acredito que minha solução funcionaria para você também. Eu tinha um arquivo de texto que continha uma lista de itens no formulário:
Eu queria analisar o acima em uma lista python, mas não estava interessado em eval () porque não podia confiar na entrada. Tentei primeiro usar JSON, mas ele só aceita itens com aspas duplas, então escrevi meu próprio lexer muito simples para este caso específico (basta conectar seu próprio "stringtoparse" e você obterá como lista de saída: 'itens')
Espero que seja útil para alguém. Aproveitar!
fonte
Funciona para mim
fonte
O trecho de código acima deve funcionar.
fonte