배열을 연결하여 JSON을 동적으로 생성

배열을 연결하여 JSON을 동적으로 생성

Bash에서 JSON을 선언하는 것은 많은 문자를 이스케이프 처리해야 하기 때문에 약간 짜증납니다.

다음과 같은 배열이 있다고 가정해 보겠습니다.

 value1="foo"
 value2="bar"
 arr=("key1" "$value1" "key2" "$value2")

":" 및 "," 문자를 사용하여 배열을 연결하는 방법이 있습니까?

내가 생각할 수 있는 유일한 것은 다음과 같이 올바른 문자를 추가하는 루프입니다.

data="";

for i in "${arr[@]}"; do
    data="$data\"$i\""
done

답변1

그리고jo, 명령줄에서 JSON을 쉽게 생성할 수 있습니다.

$ jo -p key1="$value1" key2="$value2"
{
   "key1": "foo",
   "key2": "bar"
}

또는 원하는 최종 결과에 따라

$ jo -a -p "$(jo key1="$value1")" "$(jo key2="$value2")"
[
   {
      "key1": "foo"
   },
   {
      "key2": "bar"
   }
]

문자열의 값 jo도 올바르게 인코딩됩니다.$value1$value2

답변2

그리고 perl:

$ perl -MJSON -e 'print JSON->new->pretty(1)->encode({@ARGV})' -- "${arr[@]}"
{
   "key2" : "bar",
   "key1" : "foo"
}

답변3

heredoc이 아마도 동적 JSON을 선언하는 가장 좋은 방법인 것으로 밝혀졌지만 다음을 개발할 때는 해당 기술을 몰랐습니다.

해결책은 다음과 같습니다. 다음과 같이 사용하세요.

join_arry_to_json a b c d
{"a":"b","c":"d"}

이는 숫자나 부울이 아닌 문자열에서만 작동합니다. 이제 부울 값이나 숫자를 선언하려면 다음 ^표기법을 사용하세요.

ql_join_arry_to_json a ^3 b ^true c dog

생산하다:

{"a":3,"b":true,"c":"dog"}

코드는 여기에 있습니다: https://gist.github.com/ORESoftware/a4e3948b0ce9c22752c759d7e694c9ab

관련 정보