이미 json 파일이 있고 jq를 사용하여 파일을 열고 편집하려는 시나리오가 있습니다.
json 파일(temp.json):
{
"a":{
"keya" : "abc",
"keyb" : "xyz"
},
"c":{
"keyc" : "yyy"
}
}
c
여기에서는 검색을 통해 블록 앞에 다른 json 객체를 추가하고 싶습니다 . 기본적으로 마지막 객체 앞에 값을 추가합니다. 이 경우 마지막 객체는 항상c
"b":{
"keyb" : "yop"
}
jq를 사용하여 insert 블록을 구현했는데 원하는 위치에 삽입되지 않았습니다.
jq '. |= . + {"b":{ "keyb" : "yop" }}' temp.json
어떤 도움이라도 좋을 것입니다.
답변1
jq
키를 정렬하는 데 사용할 수 있는 옵션입니다 -S
. 예를 들어
$ jq -S '. |= . + {"b":{ "keyb" : "yop" }}' temp.json
{
"a": {
"keya": "abc",
"keyb": "xyz"
},
"b": {
"keyb": "yop"
},
"c": {
"keyc": "yyy"
}
}
답변2
객체는 정렬되지 않은 키 모음입니다. 키 순서정말 상관없어요JSON 문서를 읽는 애플리케이션에. 정렬된 데이터를 원하는 경우 배열 사용을 고려하세요.
다음은 단계별 솔루션입니다. 최종 코드는 맨 끝에 있습니다.
배열은 순서가 지정되어 있으므로 다음을 사용하여 최상위 개체를 키와 값의 순서가 지정된 배열로 변환할 수 있습니다 to_entries
.
$ jq 'to_entries' file
[
{
"key": "a",
"value": {
"keya": "abc",
"keyb": "xyz"
}
},
{
"key": "c",
"value": {
"keyc": "yyy"
}
}
]
이 배열의 마지막 요소 앞에 콘텐츠를 삽입할 수 있습니다. 여기서는 첫 번째 요소(마지막 원래 요소를 제외한 모든 요소 .[:-1]
), 새 요소 및 마지막 원래 요소( ) 의 조각을 사용하여 .[-1]
"항목" 배열을 덮어씁니다 .
$ jq 'to_entries | . |= .[:-1] + [ { key: "b", value: { keyb: "yop" } }, .[-1] ]' file
[
{
"key": "a",
"value": {
"keya": "abc",
"keyb": "xyz"
}
},
{
"key": "b",
"value": {
"keyb": "yop"
}
},
{
"key": "c",
"value": {
"keyc": "yyy"
}
}
]
from_entries
그런 다음 키 순서를 변경하지 않고 원래 형식으로 다시 변환할 수 있습니다 .
$ jq 'to_entries | . |= .[:-1] + [ { key: "b", value: { keyb: "yop" } }, .[-1] ] | from_entries' file
{
"a": {
"keya": "abc",
"keyb": "xyz"
},
"b": {
"keyb": "yop"
},
"c": {
"keyc": "yyy"
}
}
명령줄에서 새 요소를 키 및 JSON 개체로 전달합니다.
$ jq --arg key 'yellow' --argjson value '{ "type": "color" }' 'to_entries | . |= .[:-1] + [ { key: $key, value: $value }, .[-1] ] | from_entries' file
{
"a": {
"keya": "abc",
"keyb": "xyz"
},
"yellow": {
"type": "color"
},
"c": {
"keyc": "yyy"
}
}