Frage

Ich bin ratlos mit diesem problem.

ActiveSupport::JSON definiert to_json auf verschiedene Kern-Objekte und so sieht der JSON-gem.Doch die Umsetzung ist nicht das gleiche-der ActiveSupport-version nimmt die Argumente und die JSON-gem-version nicht.

Ich installierte ein Juwel, das erforderlich, ist das JSON-gem und meine app brach.Das Problem ist, dass ich mit to_json in einem controller-gibt eine Liste der Objekte, aber ich möchte, um zu Steuern, welche Attribute zurückgegeben.

Wenn der code irgendwo in meinem system nicht require 'json' Ich bekomme diese Fehlermeldung:

TypeError: wrong argument type Hash (expected Data)

Ich habe versucht, ein paar Dinge, die ich Lesen online, um es zu beheben, aber nichts hat funktioniert.I ended up re-schreiben, den Edelstein zu verwenden ActiveSupport::JSON.decode statt JSON.parse.

Dies funktioniert, aber es ist nicht nachhaltig...ich kann es nicht sein, Gabelung Edelsteine jedes mal, wenn ich verwenden möchten, ein Juwel erfordert, dass der JSON-gem.

Update: Die beste Lösung HIERFÜR ist ein upgrade auf Rails 2.3 oder höher, was es behoben.

War es hilfreich?

Lösung

Update Dieses Update ist nur anwendbar auf Schienen < 2.3.Als Giles erwähnt unten, Sie fixiert diese in 2.3 intern mit sehr viel die gleiche Technik.Aber Vorsicht, das json-gem ' s früheren versuchen auf Schienen Kompatibilität (json/add/rails), die, wenn erforderlich, explizit bricht alles wieder von vorne.

Meinst du das require 'json' Anweisung selbst wirft diese Ausnahme?Oder meinst du, wenn Sie anrufen @something.to_json(:something => value) erhalten Sie den Fehler?Letzteres ist das, was ich erwarten würde, wenn Sie ein problem haben, dass der JSON-gem-dann bin ich nicht sicher, was Los ist.

Ich nur lief in dieses problem mit dem oauth gem.In meinem Fall ist es nicht eine wahre Konflikt, weil die oauth-gem nicht hängen to_json Umsetzung.Also das problem ist, dass JSON-ist Stress für den ActiveSupport Erklärungen.Ich löste dies, indem Sie einfach erfordern json bevor ActiveSupport geladen wird.Setzen

require 'json'

im inneren des Rails::Initializer hat den trick (obwohl man es nach dem block NICHT).

Das ermöglicht ActiveSupport um verpasste die Standard-JSON-Implementierung statt.

Nun, wenn Sie ein Juwel, das hängt tatsächlich davon ab, die JSON-Implementierung von to_json dann sind Sie up a creek.Dies ist definitiv das Schlimmste von meta-Programmierung, und ich würde es befürworten, die für den Schienen-und JSON-gem-Entwickler, den Konflikt zu lösen, aber es wird schmerzhaft sein, weil der eine oder andere wird brechen, rückwärts-Kompatibilität.

In der kurzen Begriff, gem Autoren können in der Lage sein, um die Lücke durch die Unterstützung beider Implementierungen.Dies ist mehr oder weniger möglich, je nachdem wie der Edelstein mit der Methode.Ein worst-case-Szenario wird eine offizielle Gabel (ie. gem und gem-rails).

Andere Tipps

UPDATE:Auch mit Rails 3.2, das gleiche problem bleibt lose.Die böse hack zwangsweise laden Sie die json-gem und überschreiben Sie ihn, das ist.

Irgendwann landete ich mit dem folgenden code, um vollständig umgehen ActiveSupport s to_json komplett.Legen Sie es in config/initializers/patches.rb, und Sie tun können, {}.jsonize oder [].jsonize zum generieren von JSON-string.Keine Konflikte mit nichts, garantiert.

# Undo the effect of 'active_support/core_ext/object/to_json'
require 'json'
[Object, Array, Hash].each do |klass|
  klass.class_eval <<-RUBY, __FILE__, __LINE__
    def jsonize(options = nil)
      ::JSON.generate self, :quirks_mode => true
    end
  RUBY
end

Die 8 Zeilen code machen Sie Ihre app 50-mal schneller für die JSON-Codierung.Wahrscheinlich möchten Sie das gleiche tun.:)


Ich habe ein ähnliches problem, bis Rails 2.3.8.

Das problem ist, dass ActiveSupport::JSON.backend = 'JSONGem' ist ein halb-assed Lösung, und Sie noch brauchen, um zu überschreiben, einige Encoder selbst.(WARNUNG:für Rails 3.x, die verwendet MultiJson, es muss sein, ActiveSupport::JSON.backend = :json_gem mindestens, oder es wird still no-op.)

In meinem Fall brauchte ich, um zu überschreiben String#to_json da JSON-gem 1.4.3 ist besser, daß es nicht blind encode non-ascii-aber-gültig-UTF8-Zeichen in der form von "\uXXXX" wo es nicht notwendig ist, so erhalten Sie kürzere bytes (gut für die Serialisierung) und einfach-zu-Lesen Ergebnisse, die ("日本語" sieht viel sexier mir in die Augen, als "\u65e5\u672c\u8a9e").

Hier ist der Affe-patch, den habe ich mit - schreiben Sie den folgenden code in config/initializers/patches.rb

module ActiveSupport
  module JSON
    module Encoding
      class << self
        def escape(string)
          ::JSON.generate([string])[1..-2]
        end
      end
    end
  end
end

und Sie sind frei zu verwenden to_json auf alles - String -, Array-und Hash.

Nachdem er gegen diesen eine Weile..Ich fand die einfachste Lösung zu sein:

if defined?(ActiveSupport::JSON)
  [Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass].each do |klass|
   klass.class_eval do
    def to_json(*args)
      super(args)
    end
    def as_json(*args)
      super(args)
    end
   end
  end
end

legte es überall nach activesupport wird geladen..

Ich bin mir ziemlich sicher, dass Sie fixiert diese in 2.3, aber ich kann mich nicht erinnern, wie.

In meinem obgleich einzigartige Fall hatte ich eine Ruby (non-rails-app, die tatsächlich geladenen einer Rails-app (von config/environment.rb load) sowie einige Edelsteine, verwiesen json.Dies verursachte mir große Kopfschmerzen aufgrund der Tatsache, dass ich konnte nicht einfach ändern Sie die Rails-app Umgebung.rb-Datei.I ended up forking eine Reihe von Edelsteinen um json zu arbeiten, ohne dass die gefürchtete TypeError:wrong argument type Hash (erwartet, Daten) angezeigt.

Ich hatte etwas Glück mit dieser Lösung, die genau das Gegenteil als community-wiki-Antwort oben...http://blog.swivel.com/code/2009/03/active-support-and-json-gems-dont-play-nice.html was im Grunde befürwortet aufrufen require 'active_support' BEVOR require 'json'

Dies war die einzige Art, wie ich es Arbeit bilden könnte, und glauben Sie mir, ich habe versucht, alles, was über viele Monate.

Ich habe noch, es zu versuchen, aber es sieht aus wie Rails 2.3.3 gibt Ihnen eine gewisse Kontrolle:

ActiveSupport::JSON.backend = 'JSONGem'

Gefunden hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top