3

Catalyst::View::JSONを介してJSON::XSにフィードしようとしている一連の Moose オブジェクトがあります。JSON::XS は、祝福されたデータ構造をエンコードできません。MooseX::Storage::Format::JSONがあることを私は知っています。しかし、それはかなり重すぎるようです。私が探しているのは、本質的にXXX.pmが提供するものと同じ情報です。生データ構造を再帰的に unbless して、(内部で使用するドライバー) が表示できるようにしたいだけです。JSON::XSJSON::AnyC:V:JSON

オブジェクトを使用Catalyst::View::JSONJSON::XSて使用するための最良の方法は何ですか? Moose私には4つの明らかな選択肢があるようです:

  1. 公開された引数が Moose オブジェクトである場合、リクエストを読み取ってファイナライズするようにパッチを適用することにより、Moose オブジェクトを操作しCatalyst::View::JSONます。C:V:JSONfreeze
  2. JSON::XSの戻り値へのフォールバックにパッチを適用します$obj->freeze if $obj->isa('Moose') && $obj->does('MooseX::Storage::Format::JSON')。および proxy によってMX:S:F:JSON使用されるクラスが(使用するために呼び出されるMoose オブジェクトに対して別の内部エンコーダーを選択した場合に大量のバグが発生することを考えるのは嫌です。JSON::AnyMX:S:F:JSONJSON::XSJSON::AnyJSON::XS
  3. 再帰的に unbless する方法を見つけて、Catalyst::View::JSONそのことをやらせてください。
  4. 絶対に使わないCatalyst::View::JSONでください。STDOUT$obj->freezeに書き込み、手動でリクエストをファイナライズするだけです。これは最もハックなようです。

他にもいくつかのオプションがあると思いますが、アイデアはありますか?私の最善の策は何ですか?

4

3 に答える 3

5

オプション 3 では、MooseX::Storage を使用して Perl データ構造を返すメソッドを提供する傾向があります。これを stash に詰め込んpack()で、ビューが選択したとおりにレンダリングできるようにします。

また、JSON::Any は (環境によって、または適切なパラメーターを に渡すことによって) 強制import()的に特定のバックエンドを選択できることにも注意してください。これがテストスイートの仕組みであり、文書化されています。

于 2010-08-03T16:16:58.633 に答える
4

オブジェクトを完全に unbless して (Moose の観点から) 完全に使用不可にすることを気にしない場合は、 unbless from を試してくださいData::Structure::Util

個人的MooseX::Storageには、よりエレガントで持続可能なソリューションを好みます。

于 2010-08-03T15:45:02.910 に答える
1

好きでも嫌いでも、私の究極の解決策は、現在は廃止されているJSON :: Syckに戻すことでした。これは、まさに私が望むことを実行します。これは、JSONへの論理的な非Mooseシリアル化の簡単な非Mooseの例です。

use JSON::Syck;
use URI;
use feature ':5.10';
say JSON::Syck::Dump(
 bless { foo => URI->new("http://www.evancarroll.com") }
)

私はJSON::XSについて著者に書きましたが、彼は機能を追加するためのゲームではありませんでした。これは、JSON ::XSメンテナであるMarcLehmannからのテキストの一部です(この機能がない理由を示すために、多数のメッセージからコンテキストから外されています) 。

いいえ、PerlではなくJSONを使用しているためです。Perlは明らかに任意のPerlデータ構造を表すことができますが、JSONはそうではないので、何をすべきかを指示する必要があります。多くの人は「データ構造をダンプするだけ」のようなものを素朴に要求しますが、JSONは非オブジェクトであるすべてのperlデータ構造を表すことさえできません。

..。

あなたの質問は次のようなものです:なぜこの1MBのjpeg画像をASCIIファイルとして送信できないのですか?単にASCIIがオクテットを表すことができないからです。

..。

あるいは、ゴミを捨てて、JSON :: XSが自分にとって良いことをすることを期待したいだけかもしれません(しかし、他の人にとっては間違っています)-JSON::XSが魔法のようにあなたが望むものを推測する方法はありません。

..。

TO_JSONです。それ以外のものはただの推測です。

..。

次に、JSONが実際に表現できるものを試してみてください。オブジェクト階層をスローして「正しいこと」を期待するのは明らかに悪いソフトウェアエンジニアリングです。プロトコルでJSONが必要な場合は、ハッキングに頼らないようにしてから、JSONを送信してください。jsonライブラリが無効なものを修正することを期待しないでください。そもそもメッセージ。

気にしない以外は、どう対応したらいいのかわからない。ただ働く!LIKE::SYCK。オブジェクトがJSONに完全に変換されることは期待していません。しかし、私はそれが機能することを望んでいる80%に該当すると思います。jQueryのインポートにJSONを使用していますが、脳外科手術中に銀行取引を実行していません。最終的には、特別な役割を使用したくありません...送信されたものはすべて、jQueryJSONリクエストへの応答に役立つレベルに魔法のように変換されます。

アップデート

申し訳ありませんが、関係のないメディアでトローリングしていると誰かが言うまで、これらの返信を見逃しました。MooseX::StorageはMoose以外のクラスでは機能しません。JSON形式でスタッシュを表す一般的な方法が必要です。残念ながら、隠し場所のメンバーの一部はMooseオブジェクトです。XML :: SimpleはこれをData::Dumper行うことができ、JSON :: Syckはこれを行うことができ、リストは続きます-私はそれをやりたいだけです。Perlと1:1である必要はありません。正直にJSON::Syck言うと、デフォルトの方法にかなり近い方法で実行したいと思います。ここでの私の議論は、「どうすれば現在とJSON::XSまったく同じように仕事をすることができるか」ということです。JSON::Syckそして、あなたの答えはあなたができないということです。したがって、私は別のソリューションを採用していません。コードを書くにはお金がかかります、なぜ私は書きたいのですかto_JSONSyckがすでにそれを正しく行っている場合...私は、Syckが望ましくないファッションをシリアル化していることを示すために否定的な発言者に負担がかかっていると言いたいです。また、AudryJSON::Syckによってシードされたことを覚えておいてください。Audryは、決してトロール、バカ、または「脳損傷」ではありません。または、私の方法で投げられている他の用語のいずれか。私はこれで締めくくります:の悪いシリアル化ルートの欠如と望ましい出力はすでに機能していますJSON::Syckこれが私にとって良い選択であると私に信じさせます。そして、MooseX :: *:JSONは任意のMooseオブジェクトで何が違うのでしょうか?メソッドではなくMooseオブジェクトを受け入れるようにコードを記述できないのはなぜだと思いますか?そうでなければ、実質的な何かで答えてください-私はより良い反応を見たいと思います。ありがとう。(@jrockway、および@Etherに向けて)

于 2010-08-04T17:30:06.823 に答える