6

私は次のような関数を返そうとしています:

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json')
def returnJSON(color, message=None):
    return  json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default)

Pyramid独自のJSONエンコーディングのため、次のように二重エンコードされています。

"{\"color\": \"color\", \"message\": \"message\"}"

どうすればこれを修正できますか?defaultMongoのカスタム型に必要なため、引数(または同等のもの)を使用する必要があります。

4

4 に答える 4

9

辞書は2回JSONエンコードされているようです。これは、次と同等です。

json.dumps(json.dumps({ "color" : "color", "message" : "message" }))

おそらく、Pythonフレームワークは結果を自動的にJSONエンコードしますか?代わりにこれを試してください:

def returnJSON(color, message=None):
  return { "color" : "color", "message" : "message" }

編集:

JSONを希望どおりに生成するカスタムPyramidレンダラーを使用するには、これを試してください(レンダラーのドキュメントレンダラーのソースに基づいています)。

起動時:

from pyramid.config import Configurator
from pyramid.renderers import JSON

config = Configurator()
config.add_renderer('json_with_custom_default', JSON(default=json_util.default))

次に、使用する'json_with_custom_default'レンダラーがあります。

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json_with_custom_default')

編集2

Response別のオプションは、レンダラーが変更してはならないオブジェクトを返すことです。例えば

from pyramid.response import Response
def returnJSON(color, message):
  json_string = json.dumps({"color": color, "message": message}, default=json_util.default)
  return Response(json_string)
于 2012-06-04T20:00:36.663 に答える
2

他の優れた回答に加えて、ビュー関数によって返されるデータがjson.dumpsを通過したくない場合は、ビュー構成でrenderer="json"を使用しないでください。 )。

だから代わりに

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json')
def returnJSON(color, message=None):
    return  json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default)

あなたはただ使うことができます

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='string')
def returnJSON(color, message=None):
    return  json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default)

stringレンダラーは、関数から返された文字列データをそのまま渡します。ただし、カスタムレンダラーを登録する方が優れたアプローチです(@oripの回答を参照)。

于 2012-06-05T12:09:11.367 に答える
1

あなたは言いませんでしたが、私はあなたがただ標準jsonモジュールを使用していると仮定します。

モジュールはJSONのjsonクラスを定義しません。dictデータの「ネイティブ」表現として 標準のPythonを使用します。をJSON文字列としてjson.dumps()エンコードします。JSON文字列を受け取り、を返します。dictjson.loads()dict

したがって、これを行う代わりに:

def returnJSON(color, message=None):
    return  json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default)

これを試してみてください:

def returnJSON(color, message=None):
    return { "color" : "color", "message" : "message" }

プレーンを返すだけdictです。iPhoneアプリがこれをどのように気に入っているかをご覧ください。

于 2012-06-04T20:07:05.370 に答える
0

与えているPythonオブジェクト(辞書)の文字列ダンプしています。

json.dumpsのマニュアルには次のように記載されています。

objをJSON形式のstrにシリアル化します。

文字列から元に戻すには、文字列をJSONオブジェクトに読み込むPythonJSON関数の読み込みを使用する必要があります。

しかし、あなたがやろうとしているように見えるのはencode、JSONへのPython辞書です。

def returnJSON(color, message=None):
    return  json.encode({ "color" : color, "message" : message })
于 2012-06-04T19:58:50.173 に答える