파일의 변수를 사용하여 JSON을 통해 데이터 푸시

파일의 변수를 사용하여 JSON을 통해 데이터 푸시

현재 JSON 구조가 필요한 API를 통해 데이터를 푸시하는 중 문제가 발생했습니다. 다음과 같이 작성한 파일에서 값을 읽어야 합니다.

file="/value"
name=$(cat "$file")

따라서 $name은 값 파일 내부의 콘텐츠에 대한 변수이며 잘 작동합니다. 데이터를 푸시해야 할 때 문제가 발생합니다.

cos -u https://myapi.com push data '{
  "sec": 0,
  "usage": 0,
  "actions": [
    {
      "name": "transfer",
      "data": {
        "from": "test",
        "to": "test2",
        "value": $name,
        "message": ""
  },

"값" 개체의 이름을 읽는 변수를 어떻게 정의합니까?

답변1

파일의 데이터가 원시 문자열로 처리되어야 한다고 가정하면 JSON으로 인코딩되어야 합니다. 이는 다음과 같이 JSON을 이해하는 프로그램을 사용하여 가장 쉽게 수행할 수 있습니다 jq.

json='
{
   "actions": [
      {
         "data": { "from": "test", "message": "", "to": "test2" },
         "name": "transfer"
      }
   ],
   "sec": 0,
   "usage": 0
}
'

json=$( jq --arg value "$(cat "$file")" '.actions[0].data.value = $value' <<<"$json" )

cos -u 'https://myapi.com' push data "$json"

$value표현식 에는 jq쉘 변수가 없지만 값 jq이 명령줄에 제공되고 --arg자동으로 JSON으로 인코딩되는 내부 변수가 있습니다.

데이터를 처리하는 좀 더 편리한 방법은 $file명령줄에서 데이터를 확장하지 않고(데이터가 큰 경우 중요할 수 있음) 데이터를 개별적으로 JSON 문자열로 변환하고 이를 삽입하는 jq메서드 에 전달하는 것입니다. 프로세스별 올바른 위치:

jq '.actions[0].data.value = input' - <( jq -Rs . data ) <<<"$json"

파일에서 읽은 키 값으로 객체를 jo생성한 data다음 셸 변수를 사용하여 객체를 삽입할 수도 있습니다.value$file

datajson=$( jo from=test message="" to="test2" value=@"$file" )

json='
{
   "actions": [
      {
         "data": '"$datajson"',
         "name": "transfer"
      }
   ],
   "sec": 0,
   "usage": 0
}
'

cos -u 'https://myapi.com' push data "$json"

삽입을 위해 JSON 문서를 구성하는 작은따옴표 문자열을 일시적으로 분리하는 방법에 주목하세요 $datajson.

관련 정보