【问题标题】:ruby POST requested Json to structured array or hash for CSVruby POST 请求 Json 到结构化数组或 CSV 散列
【发布时间】:2023-03-31 03:18:02
【问题描述】:
{
  "TOTAL" : "520"

  ,

  "PROD_101379" : {
    "IMG" : "1406301107587209.jpg",
    "NAME" : "hello sunny",
    "LINK" : "/product/productDetail.do?seq=101379",
    "SEQ" : "101379",
    "PRICE" : "18000",
    "MILEAGE" : "2"
  }
  ,

  "PROD_101378" : {
    "IMG" : "",
    "NAME" : "special gift",
    "LINK" : "/product/productDetail.do?seq=101378",
    "SEQ" : "101378",
    "PRICE" : "3000",
    "MILEAGE" : "2"
  }
  ,

  "PROD_101376" : {
    "IMG" : "1405020190326241.jpg",
    "NAME" : "it radiant",
    "LINK" : "/product/productDetail.do?seq=101376",
    "SEQ" : "101376",
    "PRICE" : "45000",
    "MILEAGE" : "2"
  }
    ,

  "PAGER" : "<div class="paging"><a href="javascript:pageForm('0');

}

我正在学习如何使用 Ruby 编程,使用 Nokogiri gem 来解析互联网数据。

以上数据是在使用 Net/HTTP 通过 POST 请求后收到的,然后使用 Json gem 解析它。

JSON.parse(x.body)

我正在尝试将这些数据转换为 CSV,如下所示:

IMG | Name | Link | SEQ | Price | Mileage |

对于每个 PROD_xxxxxx 数组。

我已经阅读了 gem 文档,并查看了这里的其他问题,以意识到很像 Nokogiri 解析 HTML(或者更像是 Array & Hash),我应该能够解析 JSON 格式。

我发现我可以通过以下方式获得某物的价值:

json_parsed["TOTAL"]

这会给我“520”

我可以使用相同的方法来获取“PROD_xxxxxx”嵌套数据,但这只会为我提供该名称的特定嵌套数据。

我希望能够遍历它们,所以我尝试了类似的方法

json_parsed["PROD*"].each do |each|

但看起来这不是使用语法的正确方法。

如果我可以遍历每个并获取“IMG”、“NAME”、“LINK”等,我正在尝试使用 CSV 来:

CSV.open(fname,"w") do |csv|
  Json_parsed[each-PROD].each do |each|
   name = each["NAME"]
   img = each["IMG"]
   csv << [name, img]
  end
end

但是,如果有比上述方法更好的方法将 JSON 数据转换为 CSV(也许这是可能的,因为 JSON 是结构化数据,如 CSV?)我将不胜感激。

谢谢,

【问题讨论】:

  • 您是否正在尝试实现目标?
  • @mudasobwa 我需要一个关于如何解决上述问题的指导。我的问题的哪一部分要求“为我编写代码”?您的评论或评论不是很有帮助。如果您认为我应该这样问,或者分享我的尝试,我会很感激您的建议。
  • 为了感谢我的建议,我希望您阅读我链接的文章。
  • @Rok ,方法很简单:对于解析的 json 的每个属性,选择从 PROD 开始的所有子对象,并用 ` | 连接子对象的所有属性。 `.

标签: ruby arrays json csv hash


【解决方案1】:

最简单的方法是遍历 PROD_* 键的值:

h = '{ ... }':

require 'json'

hash = (JSON.parse h).select { |k,v| k =~ /PROD_/ } # select PROD_* only

require 'csv'

CSV.open('filename', 'w') do |csv|
  csv << ['IMG', 'Name', 'Link', 'SEQ', 'Price', 'Mileage']
  hash.each { |k,v|
    csv << v.values
  }
end

希望对你有帮助。

【讨论】:

  • 谢谢,我想我的方向不是太偏了=]
  • 当然。你证明你已经付出了一些努力,我们在这里帮助修复粗糙度。现在整个页面可能对那些来自 google 的人有所帮助。
猜你喜欢
  • 2016-05-19
  • 2021-02-07
  • 2021-09-24
  • 1970-01-01
  • 2018-08-09
  • 2013-12-23
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
相关资源
最近更新 更多