lang/ruby

Ruby JSON multiJson oj

C/H 2018. 6. 20. 08:30


Supported JSON Engines

JSON (https://github.com/flori/json)
Ruby가 기본 제공하는 JSON 젬.
oj (https://github.com/ohler55/oj)
속도를 중시한 최적화된 JSON 젬. Ruby 기반 젬 중에서는 가장 속도가 빠르다.
yajl (https://github.com/brianmario/yajl-ruby)
정식 이름은 Yet Another JSON Library.
NSJSONSerialization
Wrapper for Apple's NSJSONSerialization in the Cocoa Framework (MacRuby only)
gson.rb
A Ruby wrapper for google-gson library (JRuby only)
JrJackson
JRuby wrapper for Jackson (JRuby only)
OkJson
A simple, vendorable JSON parser

위 목록은 Ruby 객체와 JSON 간의 직렬화 및 비직렬화 기능을 제공하는 JSON 젬이다. 위 목록 외에도 여러 가지가 있고, 그중 대부분이 쓸만하다. 그러나 개발자가 이 중 특정 라이브러리를 직접 선택하는 것보다, 상황에 따라 적절한 라이브러리를 골라주는 라이브러리인 MultiJson (https://github.com/intridea/multi_json)을 이용하는 것이 낫다. 이런 식으로 여러 젬을 캡슐화하면 애플리케이션을 특정 JSON 구현과 분리 할 수 있다. MultiJson은 표준 JSON 젬을 기본으로 사용하므로, 최적화된 성능을 위해 oj 젬을 추가로 설치한다.

sudo gem install multi_json
    Successfully installed multi_json-1.13.1
    Parsing documentation for multi_json-1.13.1
    Done installing documentation for multi_json after 0 seconds
    1 gem installed
        
sudo gem install oj
    Building native extensions. This could take a while...
    Successfully installed oj-3.6.2
    Parsing documentation for oj-3.6.2
    Done installing documentation for oj after 0 seconds
    1 gem installed

MultiJson 객체

MultiJson.dump()
Ruby 객체를 JSON으로 직렬화 한다.
MultiJson.load()
JSON을 Ruby객체로 비직렬화 한다.

MultiJson.dump() 기능

  • oj로 Ruby 객체를 직렬화할 때, 다른 플랫폼에서 일반적으로 쓰이는 카멜케이스(firstName)대신 스네이크 케이스(first_name)를 사용한다.
  • JSON 객체를 바로 직렬화 해보면 JSON 문자열이 생성되지 않을 수 있다. JSON 젬은 to_json() 메서드가 구현되어 있지 않은 클래스를 직렬화하지 않기 때문이다.
  • 키의 이름에 카멜 케이서(firstName) 대시 스테이크 케이스(first_name)를 사용한다.

MultiJson의 RubyDoc 문서에는, MultiJson.dum() 메서드의 시그너처가 다음과 같이 실려있다.
# dump(object, options = {})
옵션의 내용은 사용하게 될 JSON 구현(oj)에 따라 달라진다. 이는 MultiJson이 래퍼이기 때문이다.

require 'multi_json'

        puts "Current JSON Engine = #{MultiJson.current_adapter()}"
        puts
        
        puts MultiJson.load('{"abc":"def"}') #=> {"abc" => "def"}
        puts MultiJson.load('{"abc":"def"}', :symbolize_keys => true) #=> {:abc => "def"}
        puts MultiJson.dump({:abc => 'def'}) # convert Ruby back to JSON
        puts MultiJson.dump({:abc => 'def'}, :pretty => true) # encoded in a pretty form (if supported by the coder)
        
        class Speaker
          def initialize(first_name, last_name, email, about, company, tags, registered)
            @first_name = first_name
            @last_name = last_name
            @email = email
            @about = about
            @company = company
            @tags = tags
            @registered = registered
          end
        end
        
        speaker = Speaker.new('Larson', 'Richard', 'larsonrichard@ecratic.com',
                    'Incididunt mollit cupidatat magna excepteur do tempor ex non ...',
                    'Ecratic', %w(JavaScript, AngularJS, Yeoman), true)
        
        puts "speaker (using oj gem) = #{MultiJson.dump(speaker)}"
        puts
        
ruby basic_data_types_serialize.rb 
    Current JSON Engine = MultiJson::Adapters::Oj
    
    {"abc"=>"def"}
    {:abc=>"def"}
    {"abc":"def"}
    {
        "abc":"def"
    }
    speaker (using oj gem) = "#"


API 설계 실무에 바로 적용하는 JSON. 토마스 지음, 심효섭 옮김, 2018년 ⓒ인사이트
반응형

'lang > ruby' 카테고리의 다른 글

Ruby JSON multiJson activeSupport  (0) 2018.06.21
Ruby helloWorld  (0) 2018.06.09
RadRails와 Eclipse로 Ruby on Rails를 쉽게! (한글)  (0) 2007.05.13
RoR(Ruby on Rails)  (0) 2006.10.26