web-dev-qa-db-ja.com

RubyオブジェクトとJSONシリアル化(Railsなし)

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

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

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

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

68
BuddyJoe

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

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

105
david4dev

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"
}
11
Jimothy

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

require 'yajl'
Yajl::Encoder.encode({"foo" => "bar"}) #=> "{\"foo\":\"bar\"}"
8
Greg Campbell

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"}"
7
the Tin Man

Ruby Object to json:

require 'json'

class User
  attr_accessor :name, :age

  def initialize(name, age)
    @name = name
    @age = age
  end

  def as_json(options={})
    {
      name: @name,
      age: @age
    }
  end

  def to_json(*options)
    as_json(*options).to_json(*options)
  end
end

user = User.new("Foo Bar", 42)
puts user.to_json #=> {"name":"Foo Bar","age":42}
6
Cir0X
require 'json'
{"foo" => "bar"}.to_json
# => "{\"foo\":\"bar\"}"
4
Reactormonk

クラス(ArrayやHashなど)でビルドを取得してas_jsonおよびto_json、 必要がある require 'json/add/core'(詳細は readme をご覧ください)

1
iainbeeston

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

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

1
superluminary

Jbuilder は、Railsコミュニティによって構築されたgemです。

# 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\"}"
1
Aref Aslani

virtusを使用していました。本当に強力なツールで、指定されたクラスに基づいて動的なRuby構造構造を作成できます。簡単なDSL、Rubyハッシュ、厳密なモード: it outを確認します。

0
ka8725

実際、Jsonableという宝石があります https://github.com/treeder/jsonable 。とても甘いです。

0
dentarg