Ruby Grape: вывод json экранирован

Я работаю над образцом примера Ruby/Grape, и все работает, за исключением того, что json обслуживается экранированным. Я тоже новичок в рубине и его фреймворках (всего 3 дня), так что извините, если этот вопрос является корректирующим, и заранее спасибо

Я совершенно уверен, что не должно быть экранирования кавычек, во всяком случае, вот экранированный вывод:

"{\"word\":\"test\",\"sentiment\":\"unkown\"}"

мой код

require 'rubygems'
require 'grape'
require 'json'

class SentimentApiV1  < Grape::API
  version 'v1', :using => :path, :vendor => '3scale'
  format :json

  resource :words do
    get ':word' do
        {:word => params[:word], :sentiment => "unkown"}.to_json
    end

    post ':word' do
      {:word => params[:word], :result => "thinking"}.to_json
    end 
  end

  resource :sentences do
    get ':sentence' do
      {:sentence => params[:sentence], :result => "unkown"}.to_json
    end
  end

end

config.ru

$:.unshift "./приложение"

требуется 'sentimentapi_v1.rb'

запустить SentimentApiV1

Пакеты и версии

C:\Ruby-Projects\GrapeTest>bundle install
Using i18n (0.6.4)
Using minitest (4.7.5)
Using multi_json (1.7.7)
Using atomic (1.1.10)
Using thread_safe (0.1.0)
Using tzinfo (0.3.37)
Using activesupport (4.0.0)
Using backports (3.3.3)
Using builder (3.2.2)
Using daemons (1.1.9)
Using descendants_tracker (0.0.1)
Using hashie (2.0.5)
Using multi_xml (0.5.4)
Using rack (1.5.2)
Using rack-accept (0.4.5)
Using rack-mount (0.8.3)
Using virtus (0.5.5)
Using grape (0.5.0)
Using json (1.8.0)
Using thin (1.5.1)
Using bundler (1.3.5)

Я использую рубин 2.0, виноград .5, окна 8 64 бит


person akaphenom    schedule 19.07.2013    source источник


Ответы (3)


Причина, по которой происходит экранирование, заключается в том, что вам не нужен вызов #to_json в конце, потому что в строке 7 вы указываете format :json в качестве выходного формата.

person richoffrails    schedule 20.07.2013

хорошо - видимо, to_json в конце не нужен. возможно, двойной побег или что-то в этом роде. В демо определенно был to_json, так что вот оно.

require 'rubygems'
require 'grape'
require 'json'

class SentimentApiV1  < Grape::API
  version 'v1', :using => :path, :vendor => '3scale'
  format :json

  resource :words do
    get ':word' do
        {:word => params[:word], :sentiment => "unkown"}
    end

    post ':word' do
      {:word => params[:word], :result => "thinking"}
    end 
  end

  resource :sentences do
    get ':sentence' do
      {:sentence => params[:sentence], :result => "unkown"}
    end
  end

end
person akaphenom    schedule 19.07.2013

Ваш результат, "{\"word\":\"test\",\"sentiment\":\"unkown\"}", действительно является действительным JSON. Это строка {"word":"test","sentiment":"unkown"}. Вызвав to_json, вы преобразовали свой хеш в строку, после чего Grape вернет то, что вы ему дали. Вместо этого используйте as_json, который вернет хэш, а Grape позаботится о его правильной сериализации.

person dB.    schedule 03.08.2013