【问题标题】:To fetch elements and compare elements from JSON object in Ruby在 Ruby 中从 JSON 对象中获取元素并比较元素
【发布时间】:2022-01-19 08:24:39
【问题描述】:

我有很多类似于下面的 json 资源。但是,我只需要获取满足两个条件的 json 资源: (1) component.code.text == 舒张压 (2) valueQuantity.value

这是 JSON 对象/资源

      
     {
    "fullUrl": "urn:uuid:edf9439b-0173-b4ab-6545 3b100165832e",
    "resource": {
      "resourceType": "Observation",
      "id": "edf9439b-0173-b4ab-6545-3b100165832e",
      "component": [ {
        "code": {
          "coding": [ {
            "system": "http://loinc.org",
            "code": "8462-4",
            "display": "Diastolic Blood Pressure"
          } ],
          "text": "Diastolic Blood Pressure"
        },
        "valueQuantity": {
          "value": 81,
          "unit": "mm[Hg]",
          "system": "http://unitsofmeasure.org",
          "code": "mm[Hg]"
        }
      }, {
        "code": {
          "coding": [ {
            "system": "http://loinc.org",
            "code": "8480-6",
            "display": "Systolic Blood Pressure"
          } ],
          "text": "Systolic Blood Pressure"
        },
        "valueQuantity": {
          "value": 120,
          "unit": "mm[Hg]",
          "system": "http://unitsofmeasure.org",
          "code": "mm[Hg]"
        }
      } ]
    },
    
  }

JSON file

我需要编写一个条件来获取带有文本的资源:“舒张压” AND valueQuantity.value > 90

我写了以下代码:

    def self.hypertension_observation(bundle)
      entries = bundle.entry.select {|entry| entry.resource.is_a?(FHIR::Observation)}
      observations = entries.map {|entry| entry.resource}
      hypertension_observation_statuses = ((observations.select {|observation| observation&.component&.at(0)&.code&.text.to_s == 'Diastolic Blood Pressure'}) && (observations.select {|observation| observation&.component&.at(0)&.valueQuantity&.value.to_i >= 90}))
    end

我得到的输出没有任何错误。但是,输出中不满足第二个条件。输出包含偶数

请任何人帮助纠正这个关于仅获取的红宝石代码,输出包含值

【问题讨论】:

  • 请将 JSON 减少到最低限度;为 JSON 提供这么多不相关的条目是没有意义的;我看不到里面的组件
  • 我已经编辑了兄弟。现在看清楚了吗?

标签: arrays json ruby dictionary select


【解决方案1】:

我会根据你的 json 数据的(编辑的)版本写出我会为这样的问题做些什么。我推断完整的 json 文件是一些包含医疗数据的记录列表,我们只想获取个人舒张压读数

如果您想在 Ruby 中执行此操作,我建议您使用 ruby​​ 发行版附带的 JSON 解析器。这样做是需要一些(希望是有效的)json 数据并返回一个 Ruby 散列数组,每个散列都有嵌套数组和散列。在我的解决方案中,我将您发布的 json 保存到一个文件中,所以我会这样做:

require 'json'
require 'pp'

json_data = File.read("medical_info.json")

parsed_data = JSON.parse(json_data)

fetched_data = []

parsed_data.map do |record|
    diastolic_text = record["resource"]["component"][0]["code"]["text"]
    diastolic_value_quantity = record["resource"]["component"][0]["valueQuantity"]["value"]
    if diastolic_value_quantity < 90
      fetched_data << record
    end
end 

pp fetched_data

这将打印一个新的哈希数组,其中仅包含具有所需舒张压值的结果。 'pp' gem 用于'Pretty Print',它并不完美,但使层次结构更易于阅读。

我发现当面对我想要在 Ruby 中解析的深度嵌套的 JSON 数据时,我会将 JSON 数据保存到一个文件中,就像我在这里所做的那样,然后在文件所在的目录中,我运行 IRB 所以我可以访问我正在寻找的哈希值和数组元素。

【讨论】:

  • 这是解决发帖者整体问题的好答案。我将在这里做出的一项改进是解释为什么他们现有的解决方案不起作用(在我看来,这与他们的条件范围界定有关)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2023-02-08
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多