【问题标题】:Extracting JSON objects from JSON string从 JSON 字符串中提取 JSON 对象
【发布时间】:2011-08-10 15:10:25
【问题描述】:

我想将 JSON 字符串分解为更小的对象。我有两台服务器,一台作为整个应用程序的 Web 应用接口,另一台是存储库/数据库。

我能够以 JSON 格式从存储库检索信息到网络应用程序,但之后我不知道如何返回它。

以下是返回的 JSON 示例:

{"respPages":[{"page":{"page_url":"http://www.google.com/","created_at":"2011-08-10T11:00:19Z","website_id":1,"updated_at":"2011-08-10T11:00:19Z","id":1}},{"page":{"page_url":"http://www.blank.com/services/content_services/","created_at":"2011-08-10T11:02:46Z","website_id":1,"updated_at":"2011-08-10T11:02:46Z","id":2}}],"respSite":{"website":{"created_at":"2011-08-10T11:00:19Z","website_id":null,"updated_at":"2011-08-10T11:00:19Z","website_url":null,"id":1}},"respElementTypes":[{"element_type":{"created_at":"2011-08-10T11:00:19Z","updated_at":"2011-08-10T11:00:19Z","id":1,"tag_name":"head"}},

JSON中有四个标签:

page
website
elementType
elementData

我想创建四个数组并用匹配这些标签的对象填充它们。

我会想象代码是这样的:

#Get the json from repo using net/http
 uri = URI.parse("http://127.0.0.1:3007/repository/infoid/1.json")
 http = Net::HTTP.new(uri.host, uri.port)
 response = http.request(Net::HTTP::Get.new(uri.request_uri))


@x = response.to_hash

@pages = Array.new
@websites= Array.new
@elementDatas = Array.new
@elementTypes = Array.new

#enter code here`#For every bit of the hash, find out what it is and allocate it accordingly
    @x.each_with_index do |e,index|
    if e.tagName == pages #Getting real javascripty here. There must be someway to check the tag or title of the element
    @pages[index]=e
    end

我对返回值的目标是有四个数组,每个数组包含不同类型的对象:

  @pagesArray[1]

应包含 JSON 字符串中第一次出现的页面对象。然后对其他人做同样的事情。

当然我需要进一步分解对象,但是一旦我可以分解顶层并对其进行分类,那么我可以更深入。

在 JSON 中已经有标签标题 respPagesrespWebsites 将所有对象分组。

如何在 Ruby 中将 JSON 转换回对象并使用标签名称之类的名称引用它们?

【问题讨论】:

  • 我不明白:你想让json字符串转换成一个对象?如果是这样:ActiveSupport::JSON.decode(string)
  • 不完全。我想识别 json 字符串中的对象。字符串是多个对象组合而成,不是单数
  • 给出你预期输出的详细例子
  • @apeneadiving。由 json 字符串确定的 4 个充满对象的数组是简短的答案。编辑问题

标签: ruby-on-rails ruby json object hash


【解决方案1】:

您应该能够使用标准 JSON 库以 JSON 格式解码任何内容:

JSON.load(...)

它会对格式错误的 JSON 数据抛出异常,因此请务必对其进行彻底测试并确保它可以处理所有重要情况。

如果您尝试浏览 JSON 本身的结构,您可能需要编写一系列递归方法来处理沿途的每种情况。一个好的开始模式是这样的:

@data.each do |key, value|
  case (key)
  when 'someKey'
    handle_some_key(value)
  when 'otherKey'
    handle_other_key(value)
  end
end

您可以像本示例中那样将行为分解为方法,或者如果逻辑相当简单,则将其内联。

请注意,Array.new 的替代方案只是 [ ],就像在 JavaScript 中一样。例如:

@pages = [ ]

您会看到它在大多数 Ruby 示例中经常使用。 Hash.new 的替代品是 { }

【讨论】:

  • 关键部分是我遇到的问题。我不知道如何将 json 的特定部分与纯字符串进行比较。 Javascript short 将通过 document.getElementById() 或通过 xpath 获取。有什么方法可以比较吗? p.s 感谢关于数组的注释
  • @OVERTONE: "thanks" 通常在 stackoverflow 上用 +1 表示:)
  • 好的,所以我不明白只有 2 个部分。 @data 必须是数组或哈希才能使用 .each 方法。但我不知道如何将 json 反序列化为其中之一。其次是依赖于 1. 如果无法获取数据,则无法比较密钥。这么短的回顾,我如何将 JSON 转换为可以循环遍历的数组或哈希?
  • 也许我遗漏了一些东西,但您提供的 JSON 示例中同时包含哈希和数组。还有一些东西丢失了,可能是因为它被截断了。
  • @tadman,是的,它被截断了。有很多文字,我觉得它会占用太多的屏幕空间。但它的一般是在那里。 respPages 是一个哈希数组。 page 是带有键和信息的散列。我基本上想从对象中获取这些数组和散列,但不知道如何。使用 Json.PARSE 或 DECODE 返回一个字符串,并且 YAML 转储按原样打印对象。但我不知道如何引用它们。完全一样。我应该用更清晰的信息重新发布这个问题吗?
【解决方案2】:

以下作品:

json = {"respPages"=>[{"page"=>{"page_url"=>"http://www.google.com", "created_at"=>"2011-08-10T11:00:19Z", "website_id"=>1, "updated_at"=>"2011-08-10T11:00:19Z", "id"=>1}}, {"page"=>{"page_url"=>"http://www.blank.com/services/content_services/", "created_at"=>"2011-08-10T11:02:46Z", "website_id"=>1, "updated_at"=>"2011-08-10T11:02:46Z", "id"=>2}}], 
        "respSite"=>{"website"=>{"created_at"=>"2011-08-10T11:00:19Z", "website_id"=>nil, "updated_at"=>"2011-08-10T11:00:19Z", "website_url"=>nil, "id"=>1}}, 
        "respElementTypes"=>[{"element_type"=>{"created_at"=>"2011-08-10T11:00:19Z", "updated_at"=>"2011-08-10T11:00:19Z", "id"=>1, "tag_name"=>"head"}}]}

@respPages, @respSite, @respElementTypes = [], [], []

json.each do |key_category, group_category|
  group_category.each do |hash|
    if group_category.is_a? Array
      eval("@#{key_category}") << hash.values.first
    elsif group_category.is_a? Hash
      eval("@#{key_category}") << hash[1]
    end
  end
end

您的示例中没有任何 respData,但您知道了。

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多