在Sinatra中,如何呈现json?

Siw*_*申思维 1 ruby sinatra

我觉得这很奇怪,这很正常:

  get '/initialize' do
    # ok 
    json foo: 'bar'
  end 
Run Code Online (Sandbox Code Playgroud)

但这会导致错误:

  get '/initialize' do
    json { foo: 'bar' }   # error! 
  end 
Run Code Online (Sandbox Code Playgroud)

语法错误,意外的':',期望'}'(SyntaxError)

为什么?

我怎么写这样的代码:

  get '/initialize' do
    json { 
         item1: { 
             item2: {
                 item3: 'ok'
             }
         } 
    }

  end 
Run Code Online (Sandbox Code Playgroud)

Ama*_*dan 8

因为后一种情况假设您正在json使用块调用方法,并且foo: 'bar'它是无效的语句。即

json { foo: 'bar' }
Run Code Online (Sandbox Code Playgroud)

(几乎)与

json do
  foo: 'bar'
end
Run Code Online (Sandbox Code Playgroud)

废话 (“几乎”是因为括号的优先级和do...end稍有不同;在这种情况下并不重要。)

前一种情况假设foo: 'bar'是一个命名参数,并转换为Hash。json({ foo: 'bar' })会明确表明您正在传递Hash,而不是编写代码块。因此,以下是您尝试编写的正确语法:

get '/initialize' do
  json({ 
       item1: { 
           item2: {
               item3: 'ok'
           }
       } 
  })
end 
Run Code Online (Sandbox Code Playgroud)

您也可以使用关键字方法(尽管我发现它的可读性较差):

get '/initialize' do
  json item1: { 
           item2: {
               item3: 'ok'
           }
       }
end 
Run Code Online (Sandbox Code Playgroud)


小智 6

这个对我有用:

get '/songs' do
    content_type :json
    { song: "Wake me Up" }.to_json
end
Run Code Online (Sandbox Code Playgroud)