我正在尝试将一些XML转换成JSON
到目前为止,这就是我所拥有的
def skiddle_api
skiddlexml = 'http://xml.skiddlecdn.co.uk/affiliates/all.xml'
doc = Nokogiri::XML(open(skiddlexml))
doc.css('event#12987613').css('ticket').each do |node|
children = node.children
byebug
@ticket_json = {
'name' => children.css('name').inner_text
'facevalue' => children.css('faceValue').inner_text
}
end
respond_to do |format|
format.json { render :json => {:ticket => @ticket_json } }
end
end我现在在这里举行的活动有5-8种不同的门票类型。
我希望每个票证类型显示为JSON格式,如下所示:
{
"ticket": {
"name": "Return Coach Ticket - Glasgow - Coach A"
"faceValue": "20.00"
}
"ticket": {
"name": "Return Coach Ticket - Manchester - Coach B"
"faceValue": "25.00"
}
}我在这里做错什么了?
谢谢您:)
发布于 2017-07-09 16:55:04
问题是,每次在这里替换@ticket_json:
@ticket_json = {
'name' => children.css('name').inner_text,
'facevalue' => children.css('faceValue').inner_text
}所以每次都需要分配一个新的值,但是@ticket_json不能是散列,它必须是一个散列数组才能工作(您不能在散列中有重复的键,而您的示例有重复的键)。
然后,解决方案将是在每个循环之外创建一个数组而不是散列,并在每次迭代中添加一个票证,如下所示:
def skiddle_api
skiddlexml = 'http://xml.skiddlecdn.co.uk/affiliates/all.xml'
doc = Nokogiri::XML(open(skiddlexml))
@ticket_json = []
doc.css('event#12987613').css('ticket').each do |node|
children = node.children
@ticket_json << {
'name' => children.css('name').inner_text,
'facevalue' => children.css('faceValue').inner_text
}
end
respond_to do |format|
format.json { render :json => {:ticket => @ticket_json } }
end
end输出将如下所示:
[
{
"name":"Earlybird Ticket",
"facevalue":"30.00"
},
{
"name":"VIP Ticket",
"facevalue":"50.00"
},
{
"name":"Standard E-Ticket",
"facevalue":"0.00"
}
]如果您想保留一个ticket键,您可以这样做,只需将它们的值变成一个散列数组,例如:
def skiddle_api
skiddlexml = 'http://xml.skiddlecdn.co.uk/affiliates/all.xml'
doc = Nokogiri::XML(open(skiddlexml))
@ticket_json = { tickets: [] }
doc.css('event#12987613').css('ticket').each do |node|
children = node.children
@ticket_json[:tickets] << {
'name' => children.css('name').inner_text,
'facevalue' => children.css('faceValue').inner_text
}
end
respond_to do |format|
format.json { render :json => {:ticket => @ticket_json } }
end
end其产出将类似于:
{
"tickets": [
{
"name":"Earlybird Ticket",
"facevalue":"30.00"
},
{
"name":"VIP Ticket",
"facevalue":"50.00"
},
{
"name":"Standard E-Ticket",
"facevalue":"0.00"
}
]
}https://stackoverflow.com/questions/44998506
复制相似问题