2014-01-09 3 views
6

문제점 요약 :Oj gem을 사용하여 해시를 JSON으로 직렬화하려고합니다. Oj가 해시의 기호 키를 문자열로 자동 변환하지 않는 것 같습니다. 직렬화 중에 Oj에 "문자열 화"옵션이 있는지 궁금합니다. Oj.dump로 직렬화 할 때 심볼을 문자열로 변환합니다.

내 해시의 예입니다

example_hash = 
{:id=>1234, 
    :asset_number=>"1234-5678", 
    :latitude=>34.78495, 
    :longitude=>-92.12899, 
    :last_tracking_record_id=>123456789, 
    :bearing=>42, 
    :threat_level=>:severe} 

그리고 위과 같이 렌더링 :

결과 JSON 불행히도 나는 것 의미를 정확히 위처럼 키가
render json: Oj.dump(example_hash) 

자바 스크립트에서 요소를 액세스해야합니다 (예 : response[:asset_number]). 몇 달 전에 클라이언트 측 코드가 구현되어 이제 Oj가 추가되었으므로 서버 측 직렬화 중에 키를 문자열 화하는 방법을 찾는 것이 좋습니다.

Oj에는 symbol_keys이라는 옵션이 있습니다.이 옵션은 부울이지만 true 또는 false 중 하나를 설정하면 아무런 효과가 없습니다.

내가 발견 한 유일한 해결책은 this answer에 제안 된대로 with_indifferent_access을 사용하는 것이지만 어떤 경우에는 해시 배열을 가지고 있습니다. Oj는 Json 직렬화의 속도를 높이기 위해 Oj 자체에서이 작업을 수행하는 방법을 찾기를 원한다는 것을 감안할 때 기술적으로 배열의 각 해시에 대해 해당 메서드를 호출 할 수 있습니다. 궁극적으로, 직렬화 중에 을 수행 할 옵션 또는 설정이 OJ에 있는지 궁금합니다.

답변

9

질문을 쓰는 동안 답변을 찾을 수있었습니다. StackOverflow에서이 문제와 관련된 다른 답변을 찾을 수 없으므로 (특히 Oj 보석과 관련하여) 나는이 상황을 다른 사람들에게 도움이 될 것이라는 희망으로이 게시물을 유지할 것입니다.

this previously discussed issue on GitHub에 따르면 mode:compat으로 설정하면 실제로 기호가 문자열로 변환됩니다. 그래서 내 렌더링 라인은 이제 다음과 같습니다

render json: Oj.dump(example_hash, mode: :compat) 

다음과 같이 Oj documentation for default_options에 따르면, :compat 모드가 정의 : 다른 시스템과의 호환

을 .... 모든 객체를 직렬화하지만 은 Object가 to_hash() 또는 to_json() 메소드를 구현하는지 확인합니다. 해당 메소드가 존재하면 Object를 직렬화하는 데 사용됩니다. to_hash()는 더 유연하고 더 일관된 출력을 생성하므로 은 to_json() 메소드보다 우선합니다. to_json() 또는 to_hash() 메소드가 존재하지 않으면 Oj 내부 Object 변수 인코딩이 사용됩니다. 내가 제대로 그것을 해석하고 경우

그래서, 궁극적으로 Hash 클래스의 to_json 방법을 사용하고 있기 때문에이 솔루션이 작동하는 것 같다.

내가 성능에 영향을 미쳤는지 (확실하게 또는 부정적으로) 불확실하지만 최소한 어레이의 경우 수동으로 with_indifferent_access 또는 to_json을 호출하지 않아도됩니다.

업데이트 성능에 관해서

, cmwright는 일부 벤치마킹을했고,이 결과를 내놓았다 :

Rehearsal ---------------------------------------------- 
json  13.990000 0.250000 14.240000 (14.257051) 
oj default 3.260000 0.230000 3.490000 ( 3.491028) 
oj compat 3.360000 0.240000 3.600000 ( 3.593109) 
------------------------------------ total: 21.330000sec 

       user  system  total  real 
json  13.740000 0.240000 13.980000 (13.992641) 
oj default 3.020000 0.230000 3.250000 ( 3.248077) 
oj compat 3.060000 0.230000 3.290000 ( 3.286443) 

compat 옵션처럼 보인다

적어도 기본 Oj 옵션 파에 , 평 균보다 훨씬 더 효율적 'ol to_json.

벤치 마크 코드가 포함 된 gist입니다.

+1

필자는 compat 모드가 성능에 영향을주지 않으며 벤치 마크를 통해 내 유스 케이스에 놀랐다. 나는 10,000 개의 키로 해쉬 (string => int)를 사용했고 Benchmark.bmbm (다음의 주석에서 포맷 할 수 없음)으로 다음과 같은 결과를 얻었다. json 14.550000 0.270000 14.820000 (14.855023) oj default 3.420000 0.250000 3.670000 (3.684655) oj compat 3.500000 0.260000 3.760000 (3.758900) – cmwright

+0

@cmwright 아 매우 좋습니다. 얼마 지나지 않아 성능에 문제가 없다는 것을 확실히 알고 있었지만 실제 벤치마킹을 한 번도 할 수 없었습니다. 알아두면 좋습니다. 이 질문은 내가 예상 한 것보다 더 많은 의견을 얻고있는 것처럼 보이므로 데이터를 대답에 추가하면 마음에 들으십니까? –

+1

네, 절대적으로 그렇게하십시오. 다음 번에 컴퓨터에서 사용하는 코드의 요지를 게시 할 수 있습니다. – cmwright

관련 문제