首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >rails解析xml以显示json格式

rails解析xml以显示json格式
EN

Stack Overflow用户
提问于 2017-07-09 16:19:24
回答 1查看 50关注 0票数 1

我正在尝试将一些XML转换成JSON

到目前为止,这就是我所拥有的

代码语言:javascript
运行
复制
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格式,如下所示:

代码语言:javascript
运行
复制
{
    "ticket": {
        "name": "Return Coach Ticket - Glasgow - Coach A"
        "faceValue": "20.00"
    }
    "ticket": {
        "name": "Return Coach Ticket - Manchester - Coach B"
        "faceValue": "25.00"
    }
}

我在这里做错什么了?

谢谢您:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-09 16:55:04

问题是,每次在这里替换@ticket_json

代码语言:javascript
运行
复制
@ticket_json = {
  'name' => children.css('name').inner_text,
  'facevalue' => children.css('faceValue').inner_text
}

所以每次都需要分配一个新的值,但是@ticket_json不能是散列,它必须是一个散列数组才能工作(您不能在散列中有重复的键,而您的示例有重复的键)。

然后,解决方案将是在每个循环之外创建一个数组而不是散列,并在每次迭代中添加一个票证,如下所示:

代码语言:javascript
运行
复制
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

输出将如下所示:

代码语言:javascript
运行
复制
[
  {
    "name":"Earlybird Ticket",
    "facevalue":"30.00"
  },
  {
    "name":"VIP Ticket",
    "facevalue":"50.00"
  },
  {
    "name":"Standard E-Ticket",
    "facevalue":"0.00"
  }
]

如果您想保留一个ticket键,您可以这样做,只需将它们的值变成一个散列数组,例如:

代码语言:javascript
运行
复制
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

其产出将类似于:

代码语言:javascript
运行
复制
{
  "tickets": [
    {
      "name":"Earlybird Ticket",
      "facevalue":"30.00"
    },
    {
      "name":"VIP Ticket",
      "facevalue":"50.00"
    },
    {
      "name":"Standard E-Ticket",
      "facevalue":"0.00"
    }
  ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44998506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档