2017-06-10 1 views
-3

私はこれらのjsonシリアライズされたリストをフロントエンドに渡し、javascriptで処理しているので、 "u"接頭辞が削除されている必要があります。 Javascriptではこれらの "u"の意味を理解できません。ここで辞書の(jsonシリアライズされた)リストから「u」プレフィックスを削除するにはどうすればよいですか?

はコードです:

context['list_of_dicts'] = serialize('json', my_list_of_dicts) 
# this function is wrapped with a @json response decorator 

@json_responseは、次のようになります。

Uncaught SyntaxError: Unexpected token u in JSON at position 0 

"U" ためです:フロントエンドで

def json_response(func): 
    """ 
    A decorator thats takes a view response and turns it 
    into json. If a callback is added through GET or POST 
    the response is JSONP. 
    """ 
    def decorator(request, *args, **kwargs): 
     objects = func(request, *args, **kwargs) 
     if isinstance(objects, HttpResponse): 
      return objects 
     try: 
      data = simplejson.dumps(objects) 
      if 'callback' in request.REQUEST: 
       # a jsonp response! 
       data = '%s(%s);' % (request.REQUEST['callback'], data) 
       return HttpResponse(data, "text/javascript") 
     except: 
      data = simplejson.dumps(str(objects)) 
     return HttpResponse(data, "application/json") 
    return decorator 

、私はエラーを取得します接頭辞は削除されていません。フロントエンドがJSONをデコードできるようにするには、どのように "u"プレフィックスを削除すればよいですか?

+0

何が 'serialize'ですか、あなたがJSONを望むのであれば、なぜ' json'を使用していませんか? – jonrsharpe

+0

@jonrsharpe:Djangoメソッドだと思います。 –

+0

より多くのコードを含めるように質問を編集しました –

答えて

6

データをシリアル化しています 3回まず付き:

context['list_of_dicts'] = serialize('json', my_list_of_dicts) 

、その後、2倍以上と:

data = simplejson.dumps(str(objects)) 

これは、JSON文字列文書に変換されたビュー機能、から返さobjectsstr()表現を符号化します。 str()変換では、接頭辞uが追加されます。あなたはリテラルUnicode文字列オブジェクトを直列化されています

>>> context = {} 
>>> context['list_of_dicts'] = u'<Some JSON literal here, correctly encoded>' 
>>> import json 
>>> json.dumps(str(context)) 
'"{\'list_of_dicts\': u\'<Some JSON literal here, correctly encoded>\'}"' 

あなたのデコレータは、さらにいくつかの問題があります:あなたがマスキングされているので、あなたは、毛布exceptハンドラを使用している

  • をどんなエラーで直列化の最初の試みをsimplejson.dumps()投げた。毛布exceptを使用せず、例外を黙らせないでください。あなたは今何が間違っていたのか分からない。また、参照してくださいWhy is "except: pass" a bad programming practice?

  • 辞書にシリアル化オブジェクトが表示されます。 JSONオブジェクトを返送したい場合は、Pythonオブジェクトからなるものを最初にで構成し、全体をシリアライズします。あなたは(Django serialisation frameworkを使用してのような)カスタムシリアライゼーションのロジックが必要な場合

  • 、再エンコードに@json_responseデコレータを使用するか、または非常に少なくとも再びシリアライズされたことを避けるためにHttpResponseインスタンスを返しません。

+2

3回;彼らは 'ダンプ(オブジェクト)'だけでなく、 'str'も呼び出します! – jonrsharpe

関連する問題