Tcl: Есть ли более эффективный способ получить вложенное значение в словаре, которое было преобразовано из JSON?

#json #dictionary #tcl

#json #словарь #tcl

Вопрос:

Мне интересно, есть ли более эффективный способ получить значение ‘id’ 7777777 в паре с ключом ввода. Я использую пакет Tcllib json.

 package require json

set json {
{
    "resourceType": "Bundle",
    "id": "11111111-22222-3cc3-4444-d5d555dd5555",
    "type": "searchset",
    "total": 1,
    "link": [
        {
            "relation": "self",
            "url": "https://selfurl.com/a54"
        }
    ],
    "entry": [
        {
            "fullUrl": "https://test.sandboxtest.com/e2/1a11aaa1-22bb-3333-4444dd-e5e5ee55ee55/Patient/lastname=test",
            "resource": {
                "resourceType": "Patient",
                "id": "7777777",
                "meta": {
                    "versionId": "5",
                    "lastUpdated": "2020-10-08T18:26:31.000Z"
                }
            }
        }
    ]
}
}

set jsDict [json::json2dict $json]
set entryVal [dict get $jsDict entry]

if {[regexp {Patient id ([^ ] )} $entryVal match idVal]} {
    puts $idVal
}
  

Ответ №1:

Вы должны использовать операции со списком для массивов JSON. Итак, что-то вроде этого:

 puts [dict get [lindex [dict get $jsDict entry] 0] resource id]
  

В качестве альтернативы вы можете извлечь данные $json непосредственно из rl_json:

 puts [rl_json::json get $json entry 0 resource id]
  

Комментарии:

1. rl_json Пакет настоятельно рекомендуется. Он очень хорошо работает даже с большими документами JSON и разработан для быстрой работы. Единственным недостатком, и то только в некоторых средах, является то, что оно написано на C, а не на чистом Tcl. Это не является препятствием для большинства развертываний, но иногда у кого-то есть странные правила для такого рода вещей.