5

json にシリアライズしたくない GeoDjango モデル オブジェクトがあります。私はこれを私の見解で行います:

lat = float(request.GET.get('lat'))
lng = float(request.GET.get('lng'))
a = Authority.objects.get(area__contains=Point(lng, lat))
if a:
    return HttpResponse(simplejson.dumps({'name': a.name, 
                                          'area': a.area.geojson,
                                          'id': a.id}), 
                        mimetype='application/json')

問題はsimplejson、a.area.geojson が美しい事前生成された json であるにもかかわらず、単純な文字列と見なされることです。これはクライアントでeval()area-string を 'ing することで簡単に修正できますが、適切に修正したいと考えています。simplejson特定の文字列が既に json であり、そのまま使用する必要がある (単純な文字列として返されない)ことを教えてもらえますか? または別の回避策はありますか?

UPDATE 明確にするために、これは現在返されているjsonです:

{
    "id": 95,
    "name": "Roskilde",
    "area": "{ \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 12.078701, 55.649927 ], ... ] ] ] }"
}

課題は、「area」を単純な文字列ではなく json 辞書にすることです。

4

2 に答える 2

5

これを行うためのクリーンな方法は、JSONEncoder を拡張し、指定されたオブジェクトが既に JSON であるかどうかを検出するエンコーダーを作成することだと思います。そうであれば - それを返すだけです。そうでない場合は、通常の JSONEncoder を使用してエンコードします。

class SkipJSONEncoder(simplejson.JSONEncoder):
     def default(self, obj):
         if isinstance(obj, str) and (obj[0]=='{') and (obj[-1]=='}'): 
             return obj
         return simplejson.JSONEncoder.default(self, obj)

あなたの見解では、次を使用します。

simplejson.dumps(..., cls=SkipJSONEncoder)

何かがすでに JSON であることをテストするためのよりクリーンな方法がある場合は、それを使用してください(私のやり方では、'{' で始まり '}' で終わる文字列を探すのは見苦しいです)。

于 2010-01-08T14:23:39.770 に答える
2

著者の編集後に編集:

次のようなことができますか:

lat = float(request.GET.get('lat'))
lng = float(request.GET.get('lng'))
a = Authority.objects.get(area__contains=Point(lng, lat))
if a:
    json = simplejson.dumps({'name': a.name, 
                             'area': "{replaceme}",
                             'id': a.id}), 
    return HttpResponse(json.replace('"{replaceme}"', a.area.geojson),
                        mimetype='application/json')
于 2010-01-08T13:33:56.970 に答える