Jak dekódovat neplatný JSON řetězec v pythonu

hlasů
6

Zajímalo by mě, jestli existuje způsob, jak dekódovat JSON-jako řetězec.

Mám řetězec:

'{ hotel: { id: 123, name: hotel_name} }'

To není platný JSON řetězec, takže to nemůžu dekódovat přímo s Python API. Python bude akceptovat pouze stringified JSON řetězec ve tvaru:

 '{ hotel: { id: 123, name: hotel_name} }'

kde jsou vlastnosti citován jako řetězec.

Položena 20/09/2012 v 09:54
uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
3

Dalo by se pokusit použít obal na motor JavaScript, jako pyv8 .

import PyV8
ctx = PyV8.JSContext()
ctx.enter()
# Note that we need to insert an assignment here ('a ='), or syntax error.
js = 'a = ' + '{ hotel: { id: "123", name: "hotel_name"} }'
a = ctx.eval(js)
a.hotel.id
>> '123' # Prints
Odpovězeno 20/09/2012 v 09:59
zdroj uživatelem

hlasů
0

Není velmi elegantní a ne robustní (a snadno zlomit), ale je možné ji kludge s něčím jako:

kludged = re.sub('(?i)([a-z_].*?):', r'"\1":', string)
# { "hotel": { "id": "123", "name": "hotel_name"} }

Možná zjistíte, že pomocí pyparsing a parsePythonValue.pypříkladem může dělat, co chcete, stejně ... (nebo upravený poměrně snadno dělat tak), nebo jsonParser.pyby mohl být upraven tak, aby nevyžadovaly citován klíčové hodnoty.

Odpovězeno 20/09/2012 v 10:03
zdroj uživatelem

hlasů
9

Použijte demjson modul, který má schopnost dekódovat v non-přísném režimu.

In [1]: import demjson
In [2]: demjson.decode('{ hotel: { id: "123", name: "hotel_name"} }')
Out[2]: {u'hotel': {u'id': u'123', u'name': u'hotel_name'}}
Odpovězeno 20/09/2012 v 10:07
zdroj uživatelem

hlasů
1

@vartec již poukázal na to demjson, který pracuje dobře pro mírně neplatný JSON. Pro data, která je ještě méně JSON kompatibilní jsem napsal barely_json:

from barely_json import parse
print(parse('[no, , {complete: yes, where is my value?}]'))

tisky

[False, '', {'complete': True, 'where is my value?': ''}]
Odpovězeno 12/05/2017 v 16:11
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more