2014-03-04 5 views
1

Я обнаружил это поведение multi_json рубинового самоцвета:Кодирование и декодирование символов рубин

2.1.0 :001 > require 'multi_json' 
=> true 
2.1.0 :002 > sym = :symbol 
=> :symbol 
2.1.0 :003 > sym.class 
=> Symbol 
2.1.0 :004 > res = MultiJson.load MultiJson.dump(sym) 
=> "symbol" 
2.1.0 :005 > res.class 
=> String 

ли это подходящий способ хранения рубиновые символов? Предоставляет ли JSON какой-то способ отличить :symbol от "string"?

+2

Допустимые значения в формате JSON являются строка, число, объект, массив, логический и нуль. Другие типы должны быть преобразованы, поэтому символы хранятся в виде строк. – Stefan

ответ

2

Nope - простой ответ. Большую часть времени это действительно имеет значение для хэшей, и есть чит хешей, symbolize_keys!. Суть в том, что JSON не понимает символы, просто строки.

Поскольку вы используете MultiJson, вы также можете попросить MultiJson сделать это для вас ...

MultiJson.load('{"abc":"def"}', :symbolize_keys => true) 
+0

Итак, единственный способ символизировать ключи вручную? Понял, спасибо! – RunFor

+0

Вы можете использовать http://apidock.com/rails/ActiveSupport/HashWithIndifferentAccess - но это требует от вас контроля за созданием хэша, который я не думаю, что вы можете легко использовать MultiJson. Так что, если вам хочется копаться в MultiJson, возможно, вы можете это сделать. – Travis

+0

Оказывается, я соврал, он уже встроен: 'MultiJson.load ('{" abc ":" def "}',: symbolize_keys => true)' – Travis

Смежные вопросы