【问题标题】:rails parsing xml to show json formatrails解析xml以显示json格式
【发布时间】:2017-07-10 01:01:32
【问题描述】:

我正在尝试将一些 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"
    }
}

我在这里做错了什么?

谢谢你:)

【问题讨论】:

    标签: ruby-on-rails json xml


    【解决方案1】:

    问题是你每次都在这里替换@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"
        }
      ]
    }
    

    【讨论】:

    • 可能也值得一提,因为他们没有提到实际结果是什么(如果他们得到只有一个值,或者如果服务器崩溃了)......这就是破坏我的测试服务器的原因。一旦解决了,是的,我只是在输入你提到的所有内容。
    • @SimpleLime 你说得对,我在测试时修复了它,但没有提及。谢谢! (我已经确定了答案)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多