Я хочу преобразовать файл TSV, который у меня есть, в формат JSON для сопоставления (карты Google Fusion Maps не поддерживают сопоставление нескольких объектов в одном месте, поэтому я конвертирую его в формат JSON, чтобы попробовать Mapbox). Вот мой файл TSV, если вам интересно:

https://github.com/yongcho822/Movies-in-the-park/blob/master/MovieParksGeocodeTest.tsv

А вот мой соответствующий код на Python:

import json
import csv

def create_map(datafile):
    geo_map = {"type":"FeatureCollection"}
    item_list = []
    with open(datafile, 'r') as tsvfile:
        reader = csv.DictReader(tsvfile, delimiter = '\t')

        for i, line in enumerate(reader):
            data = {}
            data['type'] = 'Feature'
            data['id'] = i
            data['properties']={'title': line['Movie Title'],
                               'description': line['Amenities'],
                               'date': line['Date']}
            data['name'] = {line['Location']}
            data['geometry'] = {'type':'Point',
                               'coordinates':(line['Lat'], line['Lng'])}
            item_list.append(data)
        #print item_list
        for point in item_list:
            geo_map.setdefault('features', []).append(point)
        print 'CHECKPOINT'
        with open("thedamngeojson.geojson", 'w') as f:
            f.write(json.dumps(geo_map))

create_map('MovieParksGeocodeTest.tsv')

Это выдает мне ошибку в конце (после того, как он печатает CHECKPOINT), говоря

TypeError: set (['Edgebrook Park, Chicago']) не поддерживает сериализацию JSON

Я полагаю, что последние две строки - это ошибка ... но что не так и как ее исправить ??

0
SpicyClubSauce 22 Май 2015 в 23:09

1 ответ

Лучший ответ

JSON разработан как очень простой и очень переносимый формат; единственные типы значений, которые он понимает, - это строки, числа, логические значения, null (например, Python None), object (например, Python dict) и array (например, Python list).

Но по крайней мере одно из значений в вашем словаре - set:

data['name'] = {line['Location']}

Поскольку JSON не имеет типа set, вы получите сообщение об ошибке set … is not JSON serializable.

Если вам на самом деле не нужно , чтобы это был set вместо list (чего вы, вероятно, не знаете - если он действительно когда-либо имеет только один элемент, кого это волнует какой это тип коллекции?), простой ответ - изменить его на list:

data['name'] = [line['Location']]

(На самом деле, даже когда вам действительно нужно, чтобы это был набор во время обработки, вам обычно не нужно, чтобы он был набором во время хранения / обмена. Если потребителю вашего файла необходимо его использовать в комплекте, его всегда можно преобразовать обратно позже.)

1
abarnert 22 Май 2015 в 23:17