IT

Ruby 객체 및 JSON 시리얼화(레일 없음)

itgroup 2023. 2. 14. 20:10
반응형

Ruby 객체 및 JSON 시리얼화(레일 없음)

저는 루비의 JSON serialization 풍경을 이해하려고 합니다.저는 루비가 처음이에요.

Rails를 사용하지 않는 경우 JSON 시리얼화 옵션이 있습니까?

Ruby 오브젝트를 JSON으로 변환하는 방법(Rails에 대한 답변)이 여기에 있는 것 같습니다.

json gem을 사용하면 to_json 메서드를 직접 작성해야 하는 것처럼 보입니다.to_json이 어레이 및 해시와 함께 작업할 수 없습니다(문서상으로는 이와 같이 되어 있습니다). json gem이 오브젝트를 반영하여 기본 시리얼화 전략을 사용하지 않는 이유가 있습니까?이렇게 하는 거 아니야? (여기서 추측)

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 텍스트를 개체로 변환하려면(다음 두 가지 방법은 동일합니다).

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_jsonJSON에 연재하다object.from_json! stringJSON 문자열로 저장된 저장된 상태를 객체에 복사합니다.

Oj를 보세요.오래된 오브젝트를 JSON으로 변환할 때는 gotcha가 있지만 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"
}

렌더링 성능이 중요한 경우 C yajl 라이브러리의 바인딩인 yajl-ruby도 검토할 수 있습니다.이 API의 시리얼화 API는 다음과 같습니다.

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

어떤 버전의 루비를 사용하시나요? ruby -v말해줄게.

1.9.2일 경우 JSON은 표준 라이브러리에 포함되어 있습니다.

1.8을 하고 있다면gem install json인스톨 됩니다.그런 다음 코드 내에서 다음을 수행합니다.

require 'rubygems'
require 'json'

그 후 추가to_json이제 가도 좋습니다.

asdf = {'a' => 'b'} #=> {"a"=>"b"}
asdf.to_json #=> "{"a":"b"}"

루비 오브젝트를 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}
require 'json'
{"foo" => "bar"}.to_json
# => "{\"foo\":\"bar\"}"

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

아무 것도 수입할 필요가 없고 원하는 대로 작동합니다.

내 및 등)를as_json ★★★★★★★★★★★★★★★★★」to_json , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .require 'json/add/core'(자세한 내용은 Readme 참조)

Jbuilder는 철도 커뮤니티에 의해 만들어진 보석입니다.그러나 레일 이외의 환경에서도 잘 동작하며, 뛰어난 기능을 갖추고 있습니다.

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

사실, Jsonable이라는 보석 https://github.com/treeder/jsonable이 있습니다.꽤 달아요.

에는 그랬습니다.virtus매우 강력한 툴로 지정된 클래스에 따라 역동적인 루비 구조체를 만들 수 있습니다.쉬운 DSL, 루비 해시에서 오브젝트를 만들 수 있으며, 엄격한 모드가 있습니다.이것 좀 봐봐요.

언급URL : https://stackoverflow.com/questions/4464050/ruby-objects-and-json-serialization-without-rails

반응형