Как загрузить строки с "nil" в json объекты в Python - PullRequest
0 голосов
/ 05 августа 2020

В этом примере здесь , модуль json в Python может помочь загрузить строки со словом «null» в объект json, но это не работает с данными, имеющими слово "nil" в нем:

data = '''
    {
    "abc": nil,
    "def": 9
    }
'''
json.loads(data)

, что дает следующую ошибку:

JSONDecodeError                           Traceback (most recent call last)
<ipython-input-38-3302f1bae848> in <module>
      5     }
      6 '''
----> 7 json.loads(data)

~/anaconda3/envs/prediction-routine/lib/python3.7/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    346             parse_int is None and parse_float is None and
    347             parse_constant is None and object_pairs_hook is None and not kw):
--> 348         return _default_decoder.decode(s)
    349     if cls is None:
    350         cls = JSONDecoder

~/anaconda3/envs/prediction-routine/lib/python3.7/json/decoder.py in decode(self, s, _w)
    335 
    336         """
--> 337         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    338         end = _w(s, end).end()
    339         if end != len(s):

~/anaconda3/envs/prediction-routine/lib/python3.7/json/decoder.py in raw_decode(self, s, idx)
    353             obj, end = self.scan_once(s, idx)
    354         except StopIteration as err:
--> 355             raise JSONDecodeError("Expecting value", s, err.value) from None
    356         return obj, end

JSONDecodeError: Expecting value: line 3 column 12 (char 18)

Что может быть решением? Спасибо

1 Ответ

1 голос
/ 05 августа 2020

Вы имеете дело с недействительными JSON данными. Единственное, что я могу придумать, если изменить сам модуль Python json.

Например, здесь вы можете найти реализацию функции, которую вы можете редактировать (Python 3.8). Этот код (строка 41-42)

elif nextchar == 'n' and string[idx:idx + 4] == 'null':
    return None, idx + 4

должен выглядеть примерно так

elif nextchar == 'n' and string[idx:idx + 4] == 'null':
    return None, idx + 4
elif nextchar == 'n' and string[idx:idx + 3] == 'nil':
    return None, idx + 3

Я не говорю, что это рекомендуемый подход. Однако, поскольку вы имеете дело с недействительными данными JSON, вам нужно будет переписать синтаксический анализатор с нуля (если вы не можете изменить свой источник данных, чтобы получить действительные данные JSON). Таким образом, вы все еще можете использовать синтаксический анализатор Python официальный JSON, внеся очень небольшие изменения.

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