수천 개의 JSON 파일이 있고 이를 하나의 개체로 병합하고 싶습니다. 유사한 형식이 아닙니다. 자세히 설명하겠습니다. JSON의 첫 번째 예입니다.
[
{
"value 1": 1,
"value 2": 2,
"value 3": 3,
"value 4": 4
}
]
다른 유형과 유사하지 않습니다. 아래와 같이 공개 필드 및 기타 필드가 거의 없습니다.
[
{
"value 3": 300,
"value 4": 400,
"value 5": 500,
"value 6": 600
}
]
예를 들어 첫 번째 예제 형식의 파일 2개와 두 번째 예제 형식의 파일 1개가 있습니다. jq
병합 하려고 합니다 .
jq -s '.' *.json > myfile.json
세 가지 다른 객체를 사용하여 다음을 반환합니다.
[
{
"value 1": 1,
"value 2": 2,
"value 3": 3,
"value 4": 4
}
],
[
{
"value 1": 10,
"value 2": 20,
"value 3": 30,
"value 4": 40
}
],
[
{
"value 3": 300,
"value 4": 400,
"value 5": 500,
"value 6": 600
}
]
아래와 같이 하나의 개체로 병합해야 하며 jq
특정 필드가 있는 해당 파일을 제외할 수 있는 옵션이 있습니까? 예를 들어 이 필드가 있는 파일을 제외합니다 "value 6"
. 따라서 최종 JSON 출력은 다음과 같습니다.
[
{
"value 1": 1,
"value 2": 2,
"value 3": 3,
"value 4": 4
},
{
"value 1": 10,
"value 2": 20,
"value 3": 30,
"value 4": 40
}
]
답변1
inputs
모든 JSON 파일의 콘텐츠에 필터를 적용하고 선택 필터를 함께 적용할 수 있습니다 . 이 -n
플래그는 지정된 입력을 기반으로 출력 JSON이 처음부터 작성되었는지 확인하는 데 사용됩니다.
jq -n '[ inputs[] | select( has("value 6") | not ) ]' *.json
이렇게 하면 jq -n 'inputs[]'
JSON 파일을 구성하는 모든 개체를 select 함수에 사용할 수 있으며, 이 함수는 키 필드가 포함된 모든 개체를 삭제합니다 "value 6"
. [..]
필터 주위에는 배열의 최종 결과 개체가 배치됩니다 .
reduce()
또 다른 방법은 함수를 사용하여 필요한 개체를 반복적으로 추가하는 것입니다.
jq -n 'reduce inputs[] as $data (.; . + [ if $data | has("value 6") | not then $data else empty end ] )'
답변2
중첩된 json 파일을 로컬에서 병합하기 위해 Node.js를 사용하여 명령줄 도구를 만들었습니다.
https://github.com/divyeshmakwana96/injson
!include('./path-to-json/item1.json')
명령문을 사용하여 다른 json 파일의 내용을 포함 할 수 있습니다 . 하위 json 파일에는 include 문도 있을 수 있습니다.
예:
{
"pi": 3.141,
"happy": true,
"questions:": [
"!include('./questions/item1.json')",
"!include('./questions/item2.json')"
],
"answer": "!include('./answers/item1.json')"
}