Zastanawiam się, jaki jest najlepszy sposób na przekonwertowanie pary klucza w formacie JSON na wartość hash ruby z symbolem jako kluczem: przykład:
{ 'user': { 'name': 'foo', 'age': 40, 'location': { 'city' : 'bar', 'state': 'ca' } } }
==>
{ :user=>{ :name => 'foo', :age =>'40', :location=>{ :city => 'bar', :state=>'ca' } } }
Czy istnieje metoda pomocnicza, która może to zrobić?
ruby-on-rails
ruby
json
ez.
źródło
źródło
http://stackoverflow.com/a/43773159/1297435
dla szyn 4.1Odpowiedzi:
używając klejnotu json podczas analizowania łańcucha json można przekazać w opcji symbolize_names. Zobacz tutaj: http://flori.github.com/json/doc/index.html (spójrz pod parse)
na przykład:
źródło
:symbolize_keys
? dlaczego ta nazwa się zmieniła?symbolize_keys
to sprawa Railsów.Leventix, dziękuję za odpowiedź.
Metoda Marshal.load (Marshal.dump (h)) prawdopodobnie ma największą integralność spośród różnych metod, ponieważ rekursywnie zachowuje oryginalne typy kluczy .
Jest to ważne w przypadku, gdy masz zagnieżdżony hash z kombinacją kluczy ciągów i symboli i chcesz zachować ten miks podczas dekodowania (na przykład może się to zdarzyć, jeśli twój hash zawiera własne niestandardowe obiekty oprócz bardzo złożonych / zagnieżdżonych trzecich obiekty firmowe, których kluczy nie można modyfikować / konwertować z jakiegokolwiek powodu, np. ograniczenie czasowe projektu).
Na przykład:
Metoda 1 : JSON.parse - rekurencyjnie symbolizuje wszystkie klucze => Nie zachowuje oryginalnego miksu
Metoda 2 : ActiveSupport :: JSON.decode - symbolizuje tylko klucze najwyższego poziomu => Nie zachowuje oryginalnego miksu
Metoda 3 : Marshal.load - zachowuje oryginalną kombinację ciągów / symboli w zagnieżdżonych kluczach. IDEALNY!
O ile nie ma wady, której nie jestem świadomy, myślę, że metoda 3 jest drogą do zrobienia.
Twoje zdrowie
źródło
Nie ma nic wbudowanego, aby załatwić sprawę, ale nie jest zbyt trudne napisanie kodu, aby zrobić to za pomocą klejnotu JSON. Jest
symbolize_keys
metoda wbudowana w Railsy, jeśli tego używasz, ale nie symbolizuje ona rekursywnych kluczy, tak jak potrzebujesz.Jak powiedział Leventix, klejnot JSON obsługuje tylko ciągi znaków w podwójnych cudzysłowach (co jest technicznie poprawne - JSON powinien być sformatowany w cudzysłowy). Ten fragment kodu wyczyści to przed próbą przeanalizowania.
źródło
Metoda rekurencyjna:
źródło
Oczywiście istnieje klejnot json , ale obsługuje on tylko podwójne cudzysłowy.
źródło
JSON.parse(JSON.generate([:a])) # => ["a"]
Marshal.load(Marshal.dump([:a]))
zamiast.Innym sposobem rozwiązania tego problemu jest użycie serializacji / deserializacji YAML, która również zachowuje format klucza:
Korzyści z tego podejścia wydają się formatem, który jest lepiej dostosowany do usług REST ...
źródło
YAML.load
jest przeznaczony do serializacji dowolnych obiektów (np. dla pamięci podręcznej). PropozycjaYAML.safe_load
została wprowadzona kilka miesięcy po tym poście na blogu, więc jest to kwestia właściwego użycia: github.com/ruby/psych/commit/…Najwygodniej jest użyć klejnotu nice_hash: https://github.com/MarioRuiz/nice_hash
źródło