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_json
JSON에 연재하다object.from_json! string
JSON 문자열로 저장된 저장된 상태를 객체에 복사합니다.
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
'IT' 카테고리의 다른 글
MongoDB에서 Elastic Search를 사용하는 방법 (0) | 2023.02.14 |
---|---|
Newtonsoft의 JSON Serializer에서 JSON DateTime 해석 (0) | 2023.02.14 |
Facebook like 버튼을 사용하면 댓글 팝업이 사라지고 대신 "확인" 버튼이 나타납니다. (0) | 2023.02.14 |
React.memo 구문 문제 대신 useMemo 사용 (0) | 2023.02.14 |
PHP 실행 경로에서 오류를 반환합니다.에이잭스? (0) | 2023.02.14 |