Найти - Пользователи
Полная версия: Проблема со считыванием JSON и юникодом.
Начало » Python для новичков » Проблема со считыванием JSON и юникодом.
1
A.N.Onim
Всем доброго времени суток!
Есть проблемка - для удобства использования нужно в файл и из файла записывать и считывать словарь. Выбрал json. И вот когда считывается такое, например содержимое, то все нормально:
{'id': 0, 'df': 78}
А вот когда записываешь словарь в файл, то в него записывается, такое:
{u'df': 65, u'id': 5}
соответственно при использовании к такому словарю json.loads выдает ошибку:
Traceback (most recent call last):
  File "C:\Users\VMR\Desktop\library\Library.py", line 215, in <module>
    app = MyApp()
  File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_core.py", line 8631, in __init__
    self._BootstrapApp()
  File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_core.py", line 8196, in _BootstrapApp
    return _core_.PyApp__BootstrapApp(*args, **kwargs)
  File "C:\Users\VMR\Desktop\library\Library.py", line 209, in OnInit
    style=wx.DEFAULT_FRAME_STYLE^wx.MAXIMIZE_BOX^wx.RESIZE_BORDER)
  File "C:\Users\VMR\Desktop\library\Library.py", line 22, in __init__
    self.properties = json.loads(file.read())
  File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\lib\json\decoder.py", line 381, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 2 (char 1)

Как разобраться с этим юникодом?
doza_and
A.N.Onim
А вот когда записываешь словарь в файл, то в него записывается, такое:
Это как вы такое получили?
import json
a={u'id': 0, u'df': 78}
json.dump(a,open("out.json","w"))

в файле:
{"df": 78, "id": 0}
A.N.Onim
self.properties['id'] += 1
file = open("./data/preferences.txt", 'wt')
file.write(str(self.properties))
file.close()

Я так записываю) Я так понял такие файлы нужно записывать с помощью json.dump ?

UPD: агась, прочитал про сериализацию и десериализацию. Вот только вопрос - функции dump и dumps, отличается тем что первая записывает в файло-подобные обьекты, а вторая просто возвращает в битном коде ? И еще это первая сериализирует - в двоичный код, а потом в человеческом виде записывает в файл? А смысл тогда переводить битный код?
FishHook
Какой нафиг битный код, JSON - текстовый формат.
A.N.Onim
FishHook
Какой нафиг битный код, JSON - текстовый формат.
Это я знаю. Но вот что пишет документация:
json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding=“utf-8”, default=None, sort_keys=False, **kw)
Сериализует obj как форматированный JSON поток в fp (файло-подобный объект, поддерживающий метод .write()) используя эту таблицу преобразования.

теперь читаю википедию:
Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации (структуризации) — восстановление начального состояния структуры данных из битовой последовательности.

Выходит, я не так все понял. Так что же делает функция dump ?
A.N.Onim
Что не так? Есть код:
self.properties = json.loads(open("./data/preferences.txt").read())
есть файл “./data/preferences.txt”:
{'id': 8, ‘df’: 4}
а выдает все ту же ошибку:
FishHook
хоспаде
self.properties = json.loads("./data/preferences.txt")
A.N.Onim
Все решил, все получилось! Спасибо. Просто нужно кавычки в файле ставить двойные, если вручную пишешь файл и вибирать правильно ф-цию dump/dumps.
doza_and
Если вы собираетесь самостоятельно файл вбивать то документацию по формату прочитайте.
http://www.json.org/json-ru.html
Или проверйте то что написали.
http://jsonlint.com/
A.N.Onim
doza_and, спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB