【问题标题】:jq: getting default when an item array doesn0t existjq:当项目数组不存在时获取默认值
【发布时间】:2021-12-01 11:14:06
【问题描述】:

我遇到了这两个 json 对象的问题:

{
   "generalPractitioner":[
      {
         "extension":[
            {
               "url":"http://catsalut.gencat.cat/fhir/StructureDefinition/patient-tipus-relacio",
               "valueCodeableConcept":{
                  "coding":[
                     {
                        "system":"http://catsalut.gencat.cat/fhir/StructureDefinition/tipus-rel-organitzacio",
                        "code":"UPAPASSIG"
                     }
                  ]
               }
            }
         ],
         "reference":"Organization/132336"
      },
      {
         "extension":[
            {
               "url":"http://catsalut.gencat.cat/fhir/StructureDefinition/patient-tipus-relacio",
               "valueCodeableConcept":{
                  "coding":[
                     {
                        "system":"http://catsalut.gencat.cat/fhir/StructureDefinition/tipus-rel-organitzacio",
                        "code":"UPAPTERRI"
                     }
                  ]
               }
            }
         ],
         "reference":"Organization/132346"
      }
   ]
}
{
   "generalPractitioner":[
      {
         "extension":[
            {
               "url":"http://catsalut.gencat.cat/fhir/StructureDefinition/patient-tipus-relacio",
               "valueCodeableConcept":{
                  "coding":[
                     {
                        "system":"http://catsalut.gencat.cat/fhir/StructureDefinition/tipus-rel-organitzacio",
                        "code":"UPAPASSIG"
                     }
                  ]
               }
            }
         ],
         "reference":"Organization/132336"
      }
   ]
}

我正在尝试:

jq --raw-output '[ ( .generalPractitioner[0] | ( .extension[] | .url, ( .valueCodeableConcept | .coding[] | .system, .code ) ), .reference ), ( .generalPractitioner[1] | ( .extension[] | .url, ( .valueCodeableConcept | .coding[] | .system, .code ) ), .reference ) ] | @csv

整理一下,过滤表达式为:

[
  ( .generalPractitioner[0] |
    ( .extension[] |
        .url,
        ( .valueCodeableConcept |
          .coding[] |
            .system,
            .code
        )
     ),
     .reference
  ),
    ( .generalPractitioner[1] |
    ( .extension[] |
        .url,
        ( .valueCodeableConcept |
          .coding[] |
            .system,
            .code
        )
     ),
     .reference
  ),
] | @csv

我收到了这条消息:

jq: 错误 (at :55): 无法迭代 null (null)

第二个generalPractitioner 对象仅包含 1 个元素。

我知道我正在尝试访问一个不存在的元素。

我不太清楚如何使用默认的null 对象来解决它。

我想要得到的是:

.generalPractitioner[0].extension[0].url // null, .generalPractitioner[0].extension[0].valueCodeableConcept.coding[0].system // null, .generalPractitioner[0].extension[0].valueCodeableConcept.coding[0].code // null, .generalPractitioner[0].reference // null,
.generalPractitioner[1].extension[0].url // null, .generalPractitioner[0].extension[0].valueCodeableConcept.coding[0].system // null, .generalPractitioner[1].extension[0].valueCodeableConcept.coding[0].code // null, .generalPractitioner[1].reference // null,
.generalPractitioner[2].extension[0].url // null, .generalPractitioner[0].extension[0].valueCodeableConcept.coding[0].system // null, .generalPractitioner[2].extension[0].valueCodeableConcept.coding[0].code // null, .generalPractitioner[2].reference // null,
.generalPractitioner[3].extension[0].url // null, .generalPractitioner[0].extension[0].valueCodeableConcept.coding[0].system // null, .generalPractitioner[3].extension[0].valueCodeableConcept.coding[0].code // null, .generalPractitioner[3].reference // null

有什么想法吗?

【问题讨论】:

  • 检查manual 中的“错误抑制/可选运算符”? 和“替代运算符”//。根据您的最终目标,使用.extension[]? 可能已经足够了。
  • 我已经尝试添加extension[]? 位现在我面临这个问题:csv 行应该有content...,,,,但我只得到content,。我怎么能强制添加空值(csv commas,,)?
  • 您上一个问题的answer 可能正好解决了这个问题。
  • 我正在尝试调整您的方法。你能给我一些帮助吗? jqplay I'm currently working。我真的很感激你的帮助。
  • 我已经编辑了帖子,并附上了一些我需要得到的额外解释。我已经发布了一个非常粗略的代码......但这是我需要得到的......

标签: jq


【解决方案1】:

由于您希望通过迭代数组 (.generalPractitioner[]) 来生成列,同时在从第二列开始的每第四列中将输出与特定迭代步骤 (.generalPractitioner[0]) 的常数交织在一起,因此您必须将该值存储在变量 ($system) 中,以便在迭代中访问它。

jq -r '
  [
    .generalPractitioner
    | .[0].extension[0].valueCodeableConcept.coding[0].system as $system
    | .[range(4)]
    | (.extension[0] | .url, $system, .valueCodeableConcept.coding[0].code),
      .reference
  ]
  | @csv
'

Demo

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 2013-09-27
    • 2011-06-26
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2018-10-29
    • 2012-03-22
    相关资源
    最近更新 更多