1

我正在尝试使用 Python 加载一些地理数据simplejson

<!-- language: lang-py -->
string = file("prCounties.txt","r").read().decode('utf-8')  
d = simplejson.loads(string)    

文本文件有一个波浪号,这个词应该是Añasco而不是u"A\xf1asco"SimpleJson 不解析的词。来源是来自github的geoJson文件

{"type": "FeatureCollection", "properties": {"kind": "state", "state": "PR"}, "features": [[{"geometry": {"type": "MultiPolygon", "coordinates": [[[[-67.122, 18.3239], [-67.0508, 18.3075], [-67.0398, 18.291], [-67.0837, 18.2527], [-67.122, 18.2417], [-67.1603, 18.2746], [-67.1877, 18.2691], [-67.2261, 18.2965], [-67.1822, 18.3129], [-67.1275, 18.3184]]]]}, "type": "Feature", "properties": {"kind": "county", "name": u"A\xf1asco", "state": "PR"}}]]}

Python给了我错误simplejson.decoder.JSONDecodeError: Expecting object


我用来从 GitHub 加载的脚本来生成prCounties.txt. 该变量counties是与相关 GEOjson 数据的位置相关的字符串列表。

很明显,这不是保存这些数据的正确方法:

<!-- language: lang-py -->
countyGeo = [ ]

for x in counties:      
    d = simplejson.loads(urllib.urlopen("https://raw.github.com/johan/world.geo.json/master/countries/USA/PR/%s" % (x)).read())         
    countyGeo += [ d["features"][0]]
    d["features"][0]=countyGeo  
file("prCounties.txt", "w").write(str(d))

编辑:在最后一行,我strsimplejson.dumps. 我猜它现在可以正确编码。文件(“prCounties.txt”,“w”).write(simplejson.dumps(d))

4

3 回答 3

2

您的输入文件不是有效的 JSON。u字符串前有一个"A\xf1asco",是 Python 语法,不是 JSON 语法。它应该是:

"name":"A\xf1asco",

这有效:

>>> import json
>>> json.loads(u'{"name":"A\xf1asco"}')
{u'name': u'A\xf1asco'}
于 2013-02-27T21:32:33.423 回答
2

这里有两个问题。第一的:

string = file("prCounties.txt","r").read().decode('utf-8')

你为什么要解码?JSON 显式采用 UTF-8 字符串。这是 JSON 定义的一部分。可以处理 Unicode 字符串的事实simplejson使它更易于使用,但它通过将它们编码回 UTF-8 来有效地处理它们,所以……为什么不首先保持这种方式呢?

更重要的是,您的数据来自哪里?如果prCounties.txtu"Añasco"它,它不是 JSON。您不能仅仅因为它们看起来相似而将某些东西编码为一种标准并解码为完全不同的标准。

例如,如果您这样做了,则必须使用 Python解析器open('prCounties.txt', 'w').write(repr(my_dict))将其读回(可能,或者您必须自己编写一些东西)。reprast.literal_eval

或者,或者,如果您想将数据解析为 JSON,请首先将其编写为 JSON。


根据您的评论,数据来自https://raw.github.com/johan/world.geo.json/master/countries/USA/PR /Añasco.geo.json

该 URL 的原始内容是:

{"type":"FeatureCollection","properties":{"kind":"state","state":"PR"},"features":[
{"type":"Feature","properties":{"kind":"county","name":"Añasco","state":"PR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-67.1220,18.3239],[-67.0508,18.3075],[-67.0398,18.2910],[-67.0837,18.2527],[-67.1220,18.2417],[-67.1603,18.2746],[-67.1877,18.2691],[-67.2261,18.2965],[-67.1822,18.3129],[-67.1275,18.3184]]]]}}
]}

您会注意到那里没有"name": u"Añasco"(或"name": u"A\xf1asco",或类似的东西)。你可以通过调用来阅读它read——不需要从 UTF-8 或任何东西中解码它——只需将它传递给simplejson.loads它就可以了:

$ curl -O https://raw.github.com/johan/world.geo.json/master/countries/USA/PR/Añasco.geo.json
$ cp Añasco.geo.json prCounties.txt
$ python
>>> import simplejson
>>> string = file("prCounties.txt","r").read()
>>> d = simplejson.loads(string)
>>> print d
{u'type': u'FeatureCollection', u'properties': {u'kind': u'state', u'state': u'PR'}, u'features': [{u'geometry': {u'type': u'MultiPolygon', u'coordinates': [[[[-67.122, 18.3239], [-67.0508, 18.3075], [-67.0398, 18.291], [-67.0837, 18.2527], [-67.122, 18.2417], [-67.1603, 18.2746], [-67.1877, 18.2691], [-67.2261, 18.2965], [-67.1822, 18.3129], [-67.1275, 18.3184]]]]}, u'type': u'Feature', u'properties': {u'kind': u'county', u'name': u'A\xf1asco', u'state': u'PR'}}]}

看,完全没有错误。

在某个地方,您已经对这些数据进行了一些处理,以将其转换为不是 JSON 的其他东西。我的猜测是,除了做一堆不必要的额外decodeencode调用之外,你还做了一个simplejson.loads,然后尝试重新-你回来了simplejson.loads。或者,您可能已经对完整的已编码 JSON 字符串进行了 JSON 编码。不管你做了什么,那个代码,而不是你展示给我们的代码,才是错误所在。reprdictdict

最简单的解决方法可能是prCounties.txt首先正确生成。每行只需要 70 多次下载,可能需要 2 行 bash 或 4 行 Python 才能完成……</p>

于 2013-02-27T21:47:05.270 回答
0

您必须删除 prCounties.txt 文件中的“u”(如前所述)。然后您可以使用此代码,它可以很好地以 simplejson.loads() 函数可读的格式创建变量“string”:

import simplejson
string = file("prCounties.txt", "r").read().decode("string-escape")
string = unicode(string, "latin-1")
simplejson.loads(string)
于 2013-02-27T22:22:06.680 回答