JMESPath - анализировать необработанную строку как объект

У меня есть объект, который я анализирую с помощью JMESPath, где значением свойства является объект JSON, закодированный в виде строки. Я хочу иметь возможность анализировать это строковое свойство как объект JSON и работать с ним, используя только JMESPath (я знаю, что могу проанализировать значение с помощью кодировщика JSON).

Вот объект:

{
    "ARN": "arn:aws:secretsmanager:us-east-1:xxxxx:secret:todobackend/db/credentials-AP57Kn",
    "Name": "todobackend/db/credentials",
    "VersionId": "c95fae54-e7b4-4c7f-80d6-2c5649f86570",
    "SecretString": "{\"MYSQL_USER\":\"todobackend\",\"MYSQL_PASSWORD\":\"password\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1523276277.046
}

Итак, я хочу проанализировать свойство SecretString как объект JSON.

Есть идеи, возможно ли это?


person mixja    schedule 14.04.2018    source источник
comment
Боюсь, JMESPath не может этого сделать. Литеральные выражения доступны, но они не помогают в твоем случае. Вам необходимо запросить эту функцию на github.   -  person myrdd    schedule 19.06.2018


Ответы (2)


jq спасет вас:

aws secretsmanager get-secret-value --secret-id todobackend/db/credentials-AP57K | jq -r '.SecretString|fromjson|.MYSQL_USER,.MYSQL_PASSWORD'
person Mike Patnode    schedule 17.01.2020
comment
Это должен быть принятый ответ. - person geoff.weatherall; 07.07.2021

Если вы используете только JMESPath, вы можете попробовать сделать это своими руками с помощью этого запроса:

merge(@,{SecretString: {MYSQL_USER: 'todobackend', MYSQL_PASSWORD: 'password'}})

это работает хорошо. Но если вы можете сделать это на другом языке, включая jmespath, например js, вы можете сделать это следующим образом:

let jsonString = JSON.stringify(JSON.parse("{\"MYSQL_USER\":\"todobackend\",\"MYSQL_PASSWORD\":\"password\"}")).split('"').join("'").replace("{'","{").split(",'").join(",").split("':").join(":");
let mainObject = {
   "ARN": "arn:aws:secretsmanager:us-east-1:xxxxx:secret:todobackend/db/credentials-AP57Kn",
   "Name": "todobackend/db/credentials",
   "VersionId": "c95fae54-e7b4-4c7f-80d6-2c5649f86570",
   "SecretString": "{\"MYSQL_USER\":\"todobackend\",\"MYSQL_PASSWORD\":\"password\"}",
   "VersionStages": [
       "AWSCURRENT"
   ],
   "CreatedDate": 1523276277.046
}
var data = jmespath.search(mainObject, `merge(@,{SecretString:${jsonString}})`)

разрешение разделения / соединения, что код может использоваться для другой строки, подобной этой

person bosskay972    schedule 26.07.2019