Djangoでsimplejsonを使おうとしてはまりちゅう
2006年07月13日(木) 00:52
ブログの右側部分の検索を、習作としてAjax化しています。
見た目きにせずに出力しているのはあれとして、simplejsonのdjangoラッパーが、日本語をord(s)したエスケープで返してきて困っています。
一応、jsonを返すビューで、ensure_ascii=False付きで呼び出しているのですが、値が使われることなくascii以外はordするエンコーダが選択されてしまいます。
simplejson自体の引数メモ書きをみると、ensure_ascii=Falseはエラーを引き起こすことがあると書いてあります。
Djangoはあえて、引数をわたさずにsimplejson.dumpを呼び出しているのかどうか、確認をとる必要がありそうです。
とりあえず日本語を含むオブジェクトをjson化するためには、上記コード+下記の修正が必要(KeyErrorは考慮していないので注意)。
2006-10-06 追記:
trunk版は修正されています。上記ビビり修正ではなく **self.options を渡しているようです。いや、だって怖かったから・・
見た目きにせずに出力しているのはあれとして、simplejsonのdjangoラッパーが、日本語をord(s)したエスケープで返してきて困っています。
一応、jsonを返すビューで、ensure_ascii=False付きで呼び出しているのですが、値が使われることなくascii以外はordするエンコーダが選択されてしまいます。
results = Entry.objects.filter(Q(title__contains=keyword) | Q(body__contains=keyword)).order_by('-create_date')[:25]
data = ''
if len(results) > 0:
data = serializers.serialize('json', results, ensure_ascii=False)
return HttpResponse(data, mimetype='text/javascript; charset=utf-8')
simplejson自体の引数メモ書きをみると、ensure_ascii=Falseはエラーを引き起こすことがあると書いてあります。
Djangoはあえて、引数をわたさずにsimplejson.dumpを呼び出しているのかどうか、確認をとる必要がありそうです。
とりあえず日本語を含むオブジェクトをjson化するためには、上記コード+下記の修正が必要(KeyErrorは考慮していないので注意)。
#django.core.serializers.json.py - simplejson.dump(self.objects, self.stream, cls=DateTimeAwareJSONEncoder) + simplejson.dump(self.objects, self.stream, cls=DateTimeAwareJSONEncoder, ensure_ascii=self.options['ensure_ascii'])ふーむ。どうしようかな。
2006-10-06 追記:
trunk版は修正されています。上記ビビり修正ではなく **self.options を渡しているようです。いや、だって怖かったから・・
