나는 JSON을 가지고
[
{
"name": "type1",
"type": "string",
"values": {
"set1": "dataA1",
"set1": "dataA2"
}
},
{
"name": "type2",
"type": "string",
"values": {
"set1": "dataB1",
"set2": "dataB2"
}
},
{
"name": "null",
"type": "string",
"values": {
"set1": "dataC1",
"set2": "dataC2"
}
},
{
"name": "type4",
"type": "string",
"values": {
"set1": "dataD1",
"set2": "dataD2"
}
}
]
매우 긴 json이므로 이렇게 만들고 싶습니다.
{
"type1": {
"type": "string",
"values": {
"set1": "dataA1",
"set2": "dataA2"
}
},
null: {
"type": "string",
"values": {
"set1": "dataB1",
"set2": "dataB2"
}
},
"type3": {
"type": "string",
"values": {
"set1": "dataC1",
"set2": "dataC2"
}
},
"type4": {
"type": "string",
"values": {
"set1": "dataD1",
"set2": "dataD2"
}
}
}
그래서 이것이 더 나은지 아니면 오래된 것을 사용해야하는지 묻고 싶습니다. 이것이 더 낫다면 나는 전에 그것을 사용했습니다jq '.[] | .name, .type' file.json
그런 다음 새로운 json을 사용하여 이와 같은 출력을 얻는 방법
"key"
"type"
"key"
"type"
"key"
"type"
그래서 출력은
type1
string
type2
string
# the type3 and its type is not needed cause its null
type4
string
또한 일부 값 이름이 비어 있으므로 문자열도 비어 있는 것을 원하지 않습니다.
답변1
to_entries
그런 다음 비어 있지 않은 키를 선택하고 다음을 사용하여 값을 추출 할 수 있습니다.
jq 'to_entries | map(select(.key != "null"))[] | (.key, .value.type)' < file2.json
답변2
비슷한 생각또 다른 대답name
그러나 키 값을 키로 변환 하지 않고 원본 JSON 문서에서 작동합니다 .
$ jq -r 'map( select(.name != "null") | .name, .type )[]' file
type1
string
type2
string
type4
string
이는 name
값이 string 이 아닌 최상위 배열의 모든 항목을 추출합니다 null
. 그런 다음 나머지 항목에서 합계 값을 추출합니다 name
.type
일반적으로 말하면 사용하는 것이 거의 의미가 없습니다.데이터JSON의 키 값으로 원본 파일을 사용하기로 결정했습니다.