-3

ルビーで:

class Obj
  attr_accessor :price
end

my_ruby_obj = Obj.new

my_ruby_obj.to_jsonを配置します

"\"#<Obj:0x1c9b018>\""

サーバーは、jsonの戻りタイプを正しく定義するjquery ajaxリクエスト($ .getを使用)に応答して、my_ruby_obj.to_jsonをブラウザー(sinatra、content_type:jsonを使用)に送信し、次のことを行うコールバック関数(データ)を起動します。

console.log(data);

これは次を返します:

#<Obj:0x1c9b018>

では、通常ルビーオブジェクトで属性にアクセスするのと同じように、javascript / jqueryの「data.price」属性にアクセスするにはどうすればよいですか?("my_ruby_obj.price")

console.log(data.price);で試してみました。

> Undefined

ここで大きな部分が欠けているように感じます。それは、jsonがオブジェクトをどのように処理するかに関係していると思います。

何か助けはありますか? 可能であれば、jqueryでそれを行う正しい方法を探しています。

ありがとう

編集: 何が起こっているのかを理解しようとして、コールバックでこれを試しました:

newdata = $.parseJSON(data);

しかし、デバッグコンソールはそれで停止し、次のように表示されます。

> uncaught exception: Invalid JSON: #<Obj:0x1c9b018>

私はrubyオブジェクトで.to_jsonを呼び出しましたが、なぜそうなるのですか?..。

[[ new_edit: ]]

カスタムクラスからのオブジェクトのrubyjsonシリアル化が、私が想定したように機能していないようです。

ここから引用:https ://stackoverflow.com/a/4464721/988591

独自のクラスのオブジェクトでは、少し難しくなります。次のクラスの場合、to_jsonは。のようなものを生成します "\"#<A:0xb76e5728>\""。これはおそらく望ましくありません。オブジェクトをJSONとして効果的にシリアル化するには、独自のto_jsonメソッドを作成する必要があります。

例は次のとおりです...しかし..すごい...もっと簡単な方法はありませんか?

4

2 に答える 2

0

オブジェクト自体ではなく、javascriptを介してオブジェクトの文字列表現を返します。

次のJSON表現を返す必要があります。

render json: my_ruby_obj.to_json

または、アクセスする必要のあるフィールドがわかっている場合は、さらに良い方法です。

render json: {price: my_ruby_obj.price}
于 2012-11-05T00:27:22.200 に答える
0

探していたものが正確に見つかりました。自動化されたクイックソリューション。他の副次的な利点もあります(より高速です!)。

標準のjsongemは、一部のクラス(Array、Hash、..)でのみ機能し、作成したカスタムクラス/オブジェクトをJSONに変換できません。クラスのカスタム.to_jsonメソッドを自分で作成しない限り、データを整理する方法がわかりません。これは、私が避けようとしていたことです。

結局、 OjOptimized Json(gem install oj)というgemを見つけました。

著者の引用:

最適化されたJSON(Oj)は、その名前が示すように、速度が最適化されたJSON処理を提供するために作成されました。これは、Yajlやその他の一般的なRubyJSONパーサーのより高速な代替手段として設計されました。これまでのところ、解析ではYajlよりも約2倍高速で、JSONの書き込みでは3倍以上高速であることが達成されています。

Ojには、オブジェクトをJSONに変換する方法を制御するいくつかのダンプモードまたはシリアル化モードがあります。これらのモードは、デフォルトオプションの:modeオプションを使用するか、dump()メソッドのオプションの1つとして設定されます。

:objectモードは、オブジェクトをJSONオブジェクトとしてダンプし、キーは「@」文字なしでRubyオブジェクトの変数名と一致します。これは最高のパフォーマンスモードです。

私はそれをそのように使用しました:

json = Oj.dump(guy, mode: :object)しかし、私の場合は、mode::objectなしでも機能しました。

console.log(data);表示されます:

({'^o':"Human", x:38, y:58, name:"Jack", bday:{'^t':1352083824.5625}, age:50})

シリアル化が正常に機能しているので、ようやく次のことができます。

console.log(data.age);// ---> 50

シリアル化も高速です。

..それは長い乗り物でしたが;)

図書館の作者に感謝します:http ://twitter.com/#!/ peterohler

于 2012-11-05T03:32:02.633 に答える