Python / JSON: verwachtte eigenschapsnaam ingesloten in dubbele aanhalingstekens

Ik heb geprobeerd een goede manier te achterhalen om JSON-objecten in Python te laden.
Ik stuur deze JSON gegevens:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

Naar de backend waar het als een reeks wordt ontvangen, gebruikte ik json.loads(data)om het te ontleden.

Maar elke keer kreeg ik dezelfde uitzondering:

ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

Ik googled maar niets lijkt te werken naast deze oplossing json.loads(json.dumps(data)), die persoonlijk lijkt voor mij niet zo efficiënt, omdat het elke vorm van gegevens, zelfs degenen accepteren dat zijn niet in JSON-formaat.

Alle suggesties worden zeer op prijs gesteld.


Antwoord 1, Autoriteit 100%

Dit:

{
    'http://example.org/about': {
        'http://purl.org/dc/terms/title': [
            {'type': 'literal', 'value': "Anna's Homepage"}
        ]
     }
}

is niet JSON.
Dit:

{
     "http://example.org/about": {
         "http://purl.org/dc/terms/title": [
             {"type": "literal", "value": "Anna's Homepage"}
          ]
      }
}

is JSON.

bewerken:
Sommige commenters gesuggereerd dat de bovenstaande is niet genoeg.
JSON-specificatie – RFC7159stelt dat een tekenreeks begint en eindigt met een aanhalingsteken. Dat is ".
Enkel aanhalingsteken "heeft geen semantische betekenis in JSON en is alleen toegestaan binnen een tekenreeks.


Antwoord 2, autoriteit 36%

Omdat JSON alleen tekenreeksen met dubbele aanhalingstekens toestaat, kunt u de tekenreeks als volgt manipuleren:

str = str.replace("\'", "\"")

als uw JSON enkele aanhalingstekens met escapetekens (\') bevat, moet u de volgende code nauwkeuriger gebruiken:

import re
p = re.compile('(?<!\\\\)\'')
str = p.sub('\"', str)

Hiermee worden alle exemplaren van enkele aanhalingstekens vervangen door dubbele aanhalingstekens in de JSON-tekenreeks stren in het laatste geval worden ontsnapte enkele aanhalingstekens niet vervangen.

Je kunt ook js-beautifygebruiken, wat minder strikt is:

$ pip install jsbeautifier
$ js-beautify file.js

Antwoord 3, autoriteit 20%

In mijn geval waren dubbele aanhalingstekens geen probleem.

De laatste komma gaf me dezelfde foutmelding.

{'a':{'b':c,}}
           ^

Om deze komma te verwijderen, heb ik wat eenvoudige code geschreven.

import json
with open('a.json','r') as f:
    s = f.read()
    s = s.replace('\t','')
    s = s.replace('\n','')
    s = s.replace(',}','}')
    s = s.replace(',]',']')
    data = json.loads(s)

En dit werkte voor mij.


Antwoord 4, autoriteit 8%

import ast
inpt = {'http://example.org/about': {'http://purl.org/dc/terms/title':
                                     [{'type': 'literal', 'value': "Anna's Homepage"}]}}
json_data = ast.literal_eval(json.dumps(inpt))
print(json_data)

Dit zal het probleem oplossen.


Antwoord 5, Autoriteit 4%

Heel eenvoudig, die string is niet geldig JSON. Naarmate de fout zegt, moeten JSON-documenten dubbele aanhalingstekens gebruiken.

U moet de bron van de gegevens oplossen.


Antwoord 6, Autoriteit 3%

Ik heb je JSON-gegevens gecontroleerd

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

in http://jsonlint.com/ en de resultaten waren:

Error: Parse error on line 1:
{   'http://example.org/
--^
Expecting 'STRING', '}', got 'undefined'

het aanpassen aan de volgende snaar Los de JSON-fout op:

{
    "http://example.org/about": {
        "http://purl.org/dc/terms/title": [{
            "type": "literal",
            "value": "Anna's Homepage"
        }]
    }
}

Antwoord 7, Autoriteit 3%

JSON-strings moeten dubbele aanhalingstekens gebruiken. De JSON Python-bibliotheek dwingt dit, zodat u uw string niet kunt laden. Uw gegevens moeten er zo uitzien:

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

Als dat niet iets is dat u kunt doen, kunt u ast.literal_eval()gebruiken in plaats van json.loads()


Antwoord 8, Autoriteit 2%

U kunt eenvoudig de Python EVAL-functie gebruiken.

parsed_json = eval(your_json)

Antwoord 9

Zoals het duidelijk wordt vermeld, moeten namen worden ingesloten in dubbele aanhalingstekens in plaats van afzonderlijke aanhalingstekens. De snaar die je passeert is gewoon geen geldige JSON. Het zou eruit moeten zien

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

Antwoord 10

x = x.replace("'", '"')
j = json.loads(x)

Hoewel dit de juiste oplossing is, maar het kan leiden tot een behoorlijk hoofdpijn als er een JSON als deze –

{'status': 'success', 'data': {'equity': {'enabled': True, 'net': 66706.14510000008, 'available': {'adhoc_margin': 0, 'cash': 1277252.56, 'opening_balance': 1277252.56, 'live_balance': 66706.14510000008, 'collateral': 249823.93, 'intraday_payin': 15000}, 'utilised': {'debits': 1475370.3449, 'exposure': 607729.3129, 'm2m_realised': 0, 'm2m_unrealised': -9033, 'option_premium': 0, 'payout': 0, 'span': 858608.032, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 249823.93}}, 'commodity': {'enabled': True, 'net': 0, 'available': {'adhoc_margin': 0, 'cash': 0, 'opening_balance': 0, 'live_balance': 0, 'collateral': 0, 'intraday_payin': 0}, 'utilised': {'debits': 0, 'exposure': 0, 'm2m_realised': 0, 'm2m_unrealised': 0, 'option_premium': 0, 'payout': 0, 'span': 0, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 0}}}}

Heb je de waarde ‘True’opgemerkt? Gebruik dit om dingen dubbel te laten controleren op Booleans. Dit dekt die gevallen –

x = x.replace("'", '"').replace("True", '"True"').replace("False", '"False"').replace("null", '"null"')
j = json.loads(x)

Zorg er ook voor dat u geen

x = json.loads(x)

Het moet een andere variabele zijn.


Antwoord 11

Ik gebruikte deze methode en slaagde erin om de gewenste output te krijgen. mijn script

x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}"
x = x.replace("'", '"')
j = json.loads(x)
print(j['keys-value'])

uitvoer

>>> 0

Antwoord 12

with open('input.json','r') as f:
    s = f.read()
    s = s.replace('\'','\"')
    data = json.loads(s)

Dit werkte perfect voor mij. Bedankt.


Antwoord 13

Ik had een soortgelijk probleem. Twee componenten die met elkaar communiceren gebruikten een wachtrij.

Eerste component deden JSON.dumps niet voordat u een bericht op wachtrij plaatst.
Dus de JSON-string gegenereerd door het ontvangen van component was in enkele aanhalingstekens. Dit veroorzaakte fout

Expecting property name enclosed in double quotes

JSON.Dumps toevoegen Begonnen met het maken van correct geformatteerde JSON & AMP; Opgeloste kwestie.


Antwoord 14

Zoals de andere antwoorden goed uitleggen, treedt de fout op vanwege ongeldige quote tekens die zijn doorgegeven aan de JSON-module.

In mijn geval bleef ik de waardeerror zelfs na het vervangen van 'met "in mijn string. Wat ik eindelijk besefte, was dat sommige citaatachtige Unicode-symbolen hadden gevonden hun weg naar mijn string:

“  ”  ‛  ’  ‘  `  ´  ″  ′ 

Om al deze te reinigen, kunt u uw string gewoon doorgeven via een reguliere expressie:

import re
raw_string = '{“key”:“value”}'
parsed_string = re.sub(r"[“|”|‛|’|‘|`|´|″|′|']", '"', my_string)
json_object = json.loads(parsed_string)

Antwoord 15

Voor iedereen die een snelle oplossing wil, vervangt u eenvoudig alle afzonderlijke aanhalingstekens met dubbele aanhalingstekens:

import json 
predictions = []
def get_top_k_predictions(predictions_path):
    '''load the predictions'''
    with open (predictions_path) as json_lines_file:
        for line in json_lines_file:
            predictions.append(json.loads(line.replace("'", "\"")))
get_top_k_predictions("/sh/sh-experiments/outputs/john/baseline_1000/test_predictions.jsonl")

Antwoord 16

Als je een probleem hebt om het dictaat om te zetten in string en met dubbele aanhalingstekens, kan dit helpen:

json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')

json.loads-documentatie


Antwoord 17

Gebruik de functie eval.

Het zorgt voor de discrepantie tussen enkele en dubbele aanhalingstekens.


Antwoord 18

Ik had hetzelfde probleem en wat ik deed, was de enkele aanhalingstekens vervangen door de dubbele, maar wat erger was, was het feit dat ik dezelfde fout had toen ik een komma had voor het laatste attribuut van het json-object. Dus ik gebruikte regex in python om het te vervangen voordat ik de functie json.loads()gebruikte. (Wees voorzichtig met de s aan het einde van “loads”)

import re
with open("file.json", 'r') as f:
     s = f.read()
     correct_format = re.sub(", *\n *}", "}", s)
     data_json = json.loads(correct_format)

De gebruikte regex retourneert elke komma gevolgd door een nieuwe regel en “}”, en vervangt deze alleen door een “}”.


Antwoord 19

U kunt de json5PAKKET https://pypi.org/project/Project ” / json5 / in plaats van jsonPAKKET. Dit pakket kan omgaan met enkele aanhalingstekens. De decoderingsfunctie is json5.loads(data)en vergelijkbaar met de jsonPAKKET.


Antwoord 20

De JSON Syntaxis vereist aanhalingstekens voor elke “toets” en “waarde”. Dit maakt het zo’n robuust gegevensformaat. In het volgende voorbeeld gebruik ik kleuren en kleur als een sleutel:

{"colors":[
  {
     "color":"red",
     "value":"#f00"
  },
  {
     "color":"green",
     "value":"#0f0"
  },
  {
     "color":"blue",
     "value":"#00f"
  },
  {
     "color":"cyan",
     "value":"#0ff"
  },
  {
     "color":"magenta",
     "value":"#f0f"
  },
  {
     "color":"yellow",
     "value":"#ff0"
  },
  {
     "color":"black",
     "value":"#000"
  }]}

Antwoord 21

Het is altijd ideaal om de json.dumps()-methode te gebruiken.
Om van deze fout te komen, heb ik de volgende code

gebruikt

json.dumps(YOUR_DICT_STRING).replace("'", '"')

Antwoord 22

Ik heb dit probleem meerdere keren tegengekomen toen de JSON met de hand is bewerkt.
Als iemand iets uit het bestand zou verwijderen zonder dat het dezelfde fout kan geven.

Bijvoorbeeld, als uw JSON Laatste “}” ontbreekt, gooft het dezelfde fout.

Dus als u uw bestand met de hand bewerkt, zorg er dan voor dat u het formatteert zoals deze wordt verwacht door de JSON-decoder, anders komt u in hetzelfde probleem.

Ik hoop dat dit helpt!

Other episodes