72

RubyでのJSONシリアル化の状況を理解しようとしています。Rubyは初めてです。

Railsを使用していない場合、適切なJSONシリアル化オプションはありますか?

それがこの答えが(Railsに)行くところのようです RubyオブジェクトをJSONに変換する方法

json gemを使用すると、独自のto_jsonメソッドを作成する必要があるように見えます。to_jsonを配列とハッシュで動作させることができませんでした(ドキュメントにはこれらで動作すると記載されています)json gemがオブジェクトを反映してデフォルトのシリアル化戦略を使用しない理由はありますか?これはto_yamlの仕組みではありませんか(ここで推測します)

4

11 に答える 11

113

JSON ライブラリを利用できるようにするにlibjson-rubyは、パッケージ マネージャーからインストールする必要がある場合があります。

「json」ライブラリを使用するには:

require 'json'

オブジェクトを JSON に変換するには (これら 3 つの方法は同等です):

JSON.dump object #returns a JSON string
JSON.generate object #returns a JSON string
object.to_json #returns a JSON string

JSON テキストをオブジェクトに変換するには (これら 2 つの方法は同等です):

JSON.load string #returns an object
JSON.parse string #returns an object

独自のクラスのオブジェクトの場合は、少し難しくなります。次のクラスでは、to_json は のようなものを生成します"\"#<A:0xb76e5728>\""

class A
    def initialize a=[1,2,3], b='hello'
        @a = a
        @b = b
    end
end

これはおそらく望ましくありません。オブジェクトを効果的に JSON としてシリアル化するには、独自の to_json メソッドを作成する必要があります。これを行うには、from_json クラス メソッドが役立ちます。次のようにクラスを拡張できます。

class A
    def to_json
        {'a' => @a, 'b' => @b}.to_json
    end
    def self.from_json string
        data = JSON.load string
        self.new data['a'], data['b']
    end
end

「JSONable」クラスから継承することで、これを自動化できます。

class JSONable
    def to_json
        hash = {}
        self.instance_variables.each do |var|
            hash[var] = self.instance_variable_get var
        end
        hash.to_json
    end
    def from_json! string
        JSON.load(string).each do |var, val|
            self.instance_variable_set var, val
        end
    end
end

次に、JSON にシリアル化し、JSON 文字列として保存された保存状態をオブジェクトにコピーするために使用できobject.to_jsonますobject.from_json! string

于 2010-12-16T19:42:51.710 に答える
11

Ojをチェックしてください。古いオブジェクトを JSON に変換する際には落とし穴がありますが、Oj はそれを行うことができます。

require 'oj'

class A
    def initialize a=[1,2,3], b='hello'
        @a = a
        @b = b
    end
end

a = A.new
puts Oj::dump a, :indent => 2

これは以下を出力します:

{
  "^o":"A",
  "a":[
    1,
    2,
    3
  ],
 "b":"hello"
}

^oはオブジェクトのクラスを指定するために使用され、逆シリアル化を支援するために存在することに注意してください。を省略するには、モード^oを使用します。:compat

puts Oj::dump a, :indent => 2, :mode => :compat

出力:

{
  "a":[
    1,
    2,
    3
  ],
  "b":"hello"
}
于 2013-06-19T03:10:58.493 に答える
8

レンダリングのパフォーマンスが重要な場合は、C yajlライブラリーへのバインディングであるyajl-rubyも参照することをお勧めします。そのシリアル化 API は次のようになります。

require 'yajl'
Yajl::Encoder.encode({"foo" => "bar"}) #=> "{\"foo\":\"bar\"}"
于 2010-12-16T19:30:54.037 に答える
7

どのバージョンの Ruby を使用していますか? ruby -v教えてくれます。

1.9.2だと標準ライブラリにJSONが入っています

1.8.something を使用している場合は、実行gem install jsonするとインストールされます。次に、コードで次のようにします。

require 'rubygems'
require 'json'

次に、オブジェクトに追加to_jsonすると、準備完了です。

asdf = {'a' => 'b'} #=> {"a"=>"b"}
asdf.to_json #=> "{"a":"b"}"
于 2010-12-16T23:58:07.723 に答える
4
require 'json'
{"foo" => "bar"}.to_json
# => "{\"foo\":\"bar\"}"
于 2010-12-16T18:22:50.480 に答える
1

Jbuilderは、Rails コミュニティによって構築された gem です。しかし、Rails 以外の環境でも問題なく動作し、優れた機能セットを備えています。

# suppose we have a sample object as below
sampleObj.name #=> foo
sampleObj.last_name #=> bar

# using jbuilder we can convert it to json:
Jbuilder.encode do |json|
  json.name sampleObj.name
  json.last_name sampleObj.last_name
end #=> "{:\"name\" => \"foo\", :\"last_name\" => \"bar\"}"
于 2016-09-25T09:49:49.417 に答える
1

クラス (Array や Hash など) でビルドをサポートするas_jsonto_jsonは、必要がありますrequire 'json/add/core'(詳細については、readmeを参照してください) 。

于 2015-04-05T13:47:26.783 に答える
1

1.9.2 以降を使用している場合は、to_json を使用するだけで、ハッシュと配列をネストされた JSON オブジェクトに変換できます。

{a: [1,2,3], b: 4}.to_json

Rails では、Active Record オブジェクトで to_json を呼び出すことができます。:include および :only パラメータを渡して、出力を制御できます。

@user.to_json only: [:name, :email]

次のように、AR リレーションで to_json を呼び出すこともできます。

User.order("id DESC").limit(10).to_json

何もインポートする必要はなく、すべてが期待どおりに機能します。

于 2013-05-10T09:37:19.953 に答える
0

以前はvirtus. 非常に強力なツールで、指定したクラスに基づいて動的な Ruby 構造を作成できます。簡単な DSL、Ruby ハッシュからオブジェクトを作成可能、strict モードあり。それをチェックてください。

于 2016-01-15T23:44:43.437 に答える