2016-10-28 1 views
1

В настоящее время я пытаюсь преобразовать данные из шейп-файла ESRI (.shp) в Json-файл, используя пакет json.Преобразование/Сериализационные словари, содержащие большой список пар значений в json-файл в python

В этом процессе, я хочу, чтобы преобразовать dictionairy, содержащий координаты множества различных точек:

json.dumps({"Points" : coordinates}) 

В списке «координаты» выглядит следующим образом:

[[-2244.677490234375, -3717.6876220703125], [-2252.7623006509266, -3717.321774721159], 
..., [-2244.677490234375, -3717.6876220703125]] 

и содержит около нескольких сотни координатных пар.

Однако, когда я пытаюсь выполнить json.dumps, я получаю следующее сообщение об ошибке:

[-2244.677490234375, -3717.6876220703125] is not JSON serializable 

Моя первая мысль была, что она не может обрабатывать значения десятичного/поплавка Но если я выполнить следующий рабочий пример содержащий только два из координатных пар:

print(json.dumps({"Points" : [[-2244.677490234375, -3717.6876220703125], 
[-2244.677490234375, -3717.6876220703125]]})) 

Tt работы, и я не получаю сообщение об ошибке ... выход в этом случае:

{"Points": [[-2244.677490234375, -3717.6876220703125], [-2244.677490234375, -3717.6876220703125]]} 

Я не понимаю, почему он не работает с моими «координатами» -list.

ответ

0

Ошибка, которую вы видите чаще всего, происходит с пользовательскими классами. Поэтому я считаю, что ваша проблема связана с тем, как pyshp передает значения координат. Я не могу быть уверен, не видя ваш код, но, глядя на источник pyshp, я нашел an _Array class, который используется в нескольких местах.

class _Array(array.array): 
    """Converts python tuples to lits of the appropritate type. 
    Used to unpack different shapefile header parts.""" 
    def __repr__(self): 
    return str(self.tolist()) 

__repr__ может объяснить, почему вы считаете, что вы видите стандартный список или кортеж, когда на самом деле это пользовательский класс. Я собрал python fiddle, который демонстрирует исключение, предоставляя класс _Array pyshp для json.dumps().

Чтобы устранить эту проблему, вы должны передать координаты.tolist() вашему вызову дампов.

json.dumps({"Points" : coordinates.tolist()}) 
+0

спасибо! Теперь он работает, но я до сих пор не понимаю предыдущий proplem полностью ... Мои координаты на самом деле были списками. Поэтому, когда я пытался применить .tolist(), произошла ошибка, заявив, что списки не имеют метода к списку(). Итак, я преобразовал свои списки в массивы numpy, которые я, чем конвертировал обратно в списки, используя .tolist() ... И странно, теперь он работает :-D – Jannik

+0

Ah отлично. Там определенно была проблема с объектами ... Я думаю, мы никогда не узнаем :) – craigts

+0

BTW Я думаю, у вас был список массивов numpy, но не на 100% уверен. Также, пожалуйста, не забудьте отметить мой как ответ. – craigts

Смежные вопросы