1

Python のsimplejson.

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

テキスト ファイルにはチルダがあり、その単語はAñascou"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))

EDIT:最後の行で、をに置き換えましstrsimplejson.dumps。これで適切にエンコードされたと思います。file("prCounties.txt", "w").write(simplejson.dumps(d))

4

3 に答える 3

2

入力ファイルは有効な JSON ではありません。u文字列の前にがありますが"A\xf1asco"、これは JSON 構文ではなく Python 構文です。そのはず:

"name":"A\xf1asco",

これは機能します:

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

ここには 2 つの問題があります。初め:

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

なぜデコードするのですか?JSON は明示的に UTF-8 文字列を取ります。これは JSON の定義の一部です。Unicode 文字列を処理できるという事実simplejsonにより、少し使いやすくなりますが、文字列を UTF-8 にエンコードすることで効果的に処理されるため、そもそもそのままにしておくのはなぜですか?

さらに重要なことは、データはどこから来たのか? prCounties.txtそれが含まれている場合u"Añasco"、JSON ではありません。見た目が似ているからといって、何かを 1 つの標準にエンコードし、まったく異なる標準にデコードすることはできません。

たとえば、 を実行した場合は、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 ではない別のものに変換しました。私の推測では、多くの不必要な余分なdecode呼び出しencodeを行うことに加えてsimplejson.loads、. あるいは、既にエンコードされた JSON 文字列をすべて JSON エンコードしたかもしれません。何をしたとしても、表示されているコードではなく、そのコードがエラーの場所です。simplejson.loadsreprdictdict

最も簡単な修正は、おそらくprCounties.txt最初から適切に生成することです。数行ずつダウンロードするのは 70 回ほどで、おそらく 2 行の bash か 4 行の Python を実行する必要があります…</p>

于 2013-02-27T21:47:05.270 に答える
0

prCounties.txt ファイルの "u" を削除する必要があります (前述のとおり)。次に、次のコードを使用して、変数「string」を simplejson.loads() 関数で読み取り可能な形式で作成できます。

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 に答える