Mam zserializowany ciąg JSON (definicja roli szefa kuchni) i ma klucz json_class, co sprawia, że parser JSON ruby próbuje wymusić na nim obiekt Chef :: Role. Jak mogę uczynić parser zignorować ten klucz i po prostu deserializować w normalny Hash?Jak uczynić parser Ruby JSON ignorować json_class?
Odpowiedz
prostu miałem ten sam problem i znaleźć odpowiedź czytając źródło gem JSON - tylko wyłączonym JSON.create_id przed próbuje zrobić parse:
JSON.create_id = nil
JSON.parse('{ "json_class": "Chef::Role" }').class => Hash
EDIT: pamiętać, że od wersja 1.7 klejnotu (1.8.0 jest aktualne, gdy wpisuję tę aktualizację), powyższy hack nie jest już potrzebny. JSON#parse
teraz ignoruje json_class
, a zamiast tego powinno się używać JSON#load
do usuwania porzuconych obiektów.
Możesz może zrobić gsub
na ciąg przed analizą i zmienić ten konkretny klucz na coś innego.
Co powiesz na pokazanie próbki JSON przed i po?
Klawisz "json_class" służy do wskazywania, który obiekt json powinien być niezagrożony jako. Jest on dodawany przez JSON.dump. W nowszych wersjach JSON, JSON.parse
zignoruje "json_class", un-marshaling do Hash. Podczas gdy JSON.load
odłączy się od wskazanego obiektu (w twoim przypadku Chef :: Role).
JSON.parse('{ "json_class": "Chef::Role" }').class => Hash
JSON.load('{ "json_class": "Chef::Role" }').class => Chef::Role
Dzięki dla aktualizacji, Matt. Zmieniłem swoją odpowiedź, aby odzwierciedlić to dla przyszłych przechodniów. –
Zgodnie z dokumentami rozwiązanie Marka Reeda powinno z pewnością zadziałać. Ale gdy próbowałem to w Vagrantfile:
JSON.create_id = nil
vagrant_json = JSON.parse(Pathname(__FILE__).dirname.join('nodes', "#{node_name}.json").read)
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
chef.roles_path = "roles"
chef.data_bags_path = "data_bags"
chef.node_name = node_name
chef.run_list = vagrant_json.delete('run_list')
chef.json = vagrant_json
end
vagrant_json.class był Hash, ale nadal zachował wartość json_class wewnętrznie, gdy plik node.json zawierał „json_class” : „Chef :: Node "Wpis. Następnie, używając skrótu do ustawienia wartości chef.json w ostatnim wierszu, została ponownie zinterpretowana przy użyciu klasy json (a wynikiem była dziwna lista pustych przebiegów).
Oto, co zadziałało. Sam pomysł, ale nieco mniej finezji:
vagrant_json = JSON.parse(Pathname(__FILE__).dirname.join('nodes', "#{node_name}.json").read)
vagrant_json['json_class'] = nil # <== This worked
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
chef.roles_path = "roles"
chef.data_bags_path = "data_bags"
chef.node_name = node_name
chef.run_list = vagrant_json.delete('run_list')
chef.json = vagrant_json
end
Ten kod pracował ustawić oba atrybuty json i wykaz uruchamiane z pliku węzła Chef, z lub bez „json_class” : „Chef :: Node” pozycja.
Podsumowując, poprzednia odpowiedź wydaje się być całkowicie poprawna w odniesieniu do uzyskania skrótu od JSON.parse, ale jeśli nie usuniesz pary json_class z tego skrótu, problem może być późniejszy, jak w tym przypadku .
- 1. XML Parser dla Ruby
- 2. Ruby on Rails i JSON parser z URL
- 3. Zadanie ogórka nie działa, obwinia parser JSON
- 4. Korzystanie z Jackson JSON Parser: Complex JSON?
- 5. Jackson JSON Marshall ignorować getter
- 6. Zalecany parser JSON w C?
- 7. Jak uczynić konstruktor klasy prywatnym w Ruby?
- 8. Jak ignorować obiekty puste podczas pisania JSON z JsonCpp
- 9. Jak uczynić Spring Security akceptować JSON zamiast parametrów formularza?
- 10. Nie można uzyskać poprawy wydajności przy użyciu parser Oj JSON
- 11. AFNetworking - Jak uczynić żądanie POST
- 12. jak uczynić argument opcjonalnym w python argparse
- 13. Jak mogę uczynić widget Qt ignorować arkusze stylów ustawione na widgetach nadrzędnych?
- 14. parse json sprzeciwić Ruby
- 15. WinMerge: jak ignorować komentarze
- 16. Jak zrozumieć parser Anorm?
- 17. Jak przekonwertować obiekt hash ruby na JSON?
- 18. analizowania Ruby tablicy do JSON
- 19. od json do ruby hash?
- 20. Ruby serializować struct z JSON
- 21. Nie mogę uczynić z WebApi MVC4 pól NULL w JSON
- 22. PHP: czy parser JSON lub XML jest szybszy?
- 23. Jackson parser JSON nieprawidłowy UTF-8 początek bajt
- 24. .gitignore: Jak ignorować zagnieżdżone katalogi?
- 25. Jak ignorować Wyjątki w Javie
- 26. Apache Commons CLI 1.3.1: Jak ignorować nieznane argumenty?
- 27. Porównanie JSON Parser dla Objective-C (JSON Framework, YAJL, TouchJSON, itp.)
- 28. Jak uczynić tło JTable przezroczystym?
- 29. Jak uczynić RibbonApplicationMenuBar nieaktywnym/aktywnym?
- 30. Jak uczynić cały td linkiem?
Wow, wygląda jak haker, ale tak naprawdę jest to udokumentowane API: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/JSON.html#create_id – jes5199