Error: Set not JSON Serializable while converting TSV File into JSON Format using Python
Error: Set not JSON Serializable while converting TSV File into JSON Format using Python
我想将我拥有的 TSV 文件转换为 JSON 映射格式(google 融合映射不支持在同一位置映射多个对象,因此我正在转换它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 ']) is not JSON serializable
我认为最后两行是错误所在..但是出了什么问题,我该如何解决?
JSON 被设计成一种非常简单、非常便携的格式;它理解的唯一类型的值是字符串、数字、布尔值、null(如 Python None
)、object
s(如 Python dict
)和array
s(像 Python list
)。
但是你字典中至少有一个值是 set
:
data['name'] = {line['Location']}
由于 JSON 没有 set
类型,您会收到一条错误消息,告诉您 set … is not JSON serializable
.
如果你实际上不需要需要这是一个set
而不是list
(你可能不需要——如果它真的只有一个元素,谁在乎它是哪种集合类型?),简单的答案是将其更改为 list
:
data['name'] = [line['Location']]
(事实上,即使您 在处理过程中需要将其作为一个集合,您通常也不需要在 storage/interchange 期间将其作为一个集合。如果您的文件的使用者需要将它作为一个集合来使用,它可以随时将其转换回来。)
我想将我拥有的 TSV 文件转换为 JSON 映射格式(google 融合映射不支持在同一位置映射多个对象,因此我正在转换它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 ']) is not JSON serializable
我认为最后两行是错误所在..但是出了什么问题,我该如何解决?
JSON 被设计成一种非常简单、非常便携的格式;它理解的唯一类型的值是字符串、数字、布尔值、null(如 Python None
)、object
s(如 Python dict
)和array
s(像 Python list
)。
但是你字典中至少有一个值是 set
:
data['name'] = {line['Location']}
由于 JSON 没有 set
类型,您会收到一条错误消息,告诉您 set … is not JSON serializable
.
如果你实际上不需要需要这是一个set
而不是list
(你可能不需要——如果它真的只有一个元素,谁在乎它是哪种集合类型?),简单的答案是将其更改为 list
:
data['name'] = [line['Location']]
(事实上,即使您 在处理过程中需要将其作为一个集合,您通常也不需要在 storage/interchange 期间将其作为一个集合。如果您的文件的使用者需要将它作为一个集合来使用,它可以随时将其转换回来。)