【问题标题】:HTTParty parsing sub-component of responseHTTParty 解析响应的子组件
【发布时间】:2018-07-28 13:02:48
【问题描述】:

以下控制器操作

@result = HTTParty.post(
  'https://test.co.uk/interface/search', 
  :body => [...]

有回应。未以预期的 json 解析结构查看响应。这是一个很长的哈希...

{"versionNumber"=>"5.5", "availabilitySummary"=>{"totalAvailable"=>102, "totalOnRequest"=>0}, 
"structures"=>[... big array]

数组有多个子哈希"currencyCode"=>"USD", "info", "options"=>[sub-array]。 我想首先在视图表单中访问结构数组(出于测试目的,在最终将结果提交到数据库之前。)

如何做到这一点?

【问题讨论】:

    标签: ruby-on-rails arrays json httparty


    【解决方案1】:

    首先,如果可能的话,将 HTTParty 的东西移到一个 worker 上。这样,如果您访问数据的服务器不可用,您将避免应用程序崩溃。否则,请确保将 HTTParty 内容包装在 begin - rescue - end 块中并在那里捕获适当的异常。 其次,将整个 JSON 传递给视图并在视图中访问它是一种不好的做法,因为它会大大减慢模板渲染的速度。相反,创建一个服务对象,该对象将返回易于在视图中访问的数据模型。给它起一个名字,以某种方式描述它所涉及的内容 - MyJsonParser 可能不是最好的名字,但你知道我的意思。实现#call 方法,该方法以易于在视图中访问的格式为您返回数据。

    my_json_parser.rb

    class MyJsonPArser
      def call
        response = post_request
        parse_structures(response)
      end
    
      private
    
      def post_request
        HTTParty.post(...)
      end
    
      def parse_structures(response)
        structures = response["structures"]
        # do more work with the big structures array ...
      end
    
    end
    

    your_controller.rb

    def your_method
      @data = MyJsonParser.new.call
    end
    

    your_view.html.erb

    <% @data.each do |item| %>
      <div><%= item %></div>
      ...
    <% end %>
    

    【讨论】:

    • 虽然很有帮助,但正如我的问题所指出的那样,有三个“项目”,我希望使用第三个项目 - structures 如何具体调用它?
    • 快到了...我的意图是如何要求密钥说structures 并使用该密钥的数组...因为我将不得不对子数组进行操作也是。谁知道索引值是否会在服务器上保持不变,而键会。
    • 我忘了从响应中获取结构数组。看我的回答,我已经更新了。您可以像在任何其他哈希中一样通过字符串或符号引用它来从哈希中访问密钥:hash["structures"]。在这种情况下,您希望通过字符串访问它,因为它不是 HashWithIndifferentAccess 而是一个简单的 JSON 对象。
    • 函数。这是相关的,因为将提供许多子阵列,并且它们最好被密钥识别。 [我认为这是一个单独的问题......但这是一个相关的后果] 这种方法是否有任何可以缓解的性能影响?
    • 不应该。从响应中访问结构数组在这里不是问题,但是性能取决于您随后如何使用数组。不要忘记为它编写测试;)祝你好运!
    【解决方案2】:

    我认为你可以这样做:

    @result["structures"][0]
    
    
    @result["structures"][1]
    

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多