중첩된 json 객체에서 특정 키를 유지하는 방법은 무엇입니까?

중첩된 json 객체에서 특정 키를 유지하는 방법은 무엇입니까?

다음 파일이 있습니다 config.json.

{
        "auths": {
                "reg1.io": {
                        "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                },
                "reg2.io": {
                        "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
                },
                "reg3.io": {
                        "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
                }
        }
}

reg2.io나는 내가 얻고 싶은 물건을 계속 갖고 싶습니다 .

{
        "auths": {
                "reg2.io": {
                        "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
                }
        }
}

다음과 같은 특정 개체를 삭제할 수 있습니다.

→ jq 'del(.. | ."reg2.io"? )' ./config.json
{
  "auths": {
    "reg1.io": {
      "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "reg3.io": {
      "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
    }
  }
}

하지만 특정 객체를 유지하고 싶다면 어떻게 해야 할까요? 감사해요.

답변1

원하는 키만 선택하려면 select()with를 사용하세요 .with_entries()

$ jq '.auths |= with_entries(select(.key == "reg2.io"))' file
{
  "auths": {
    "reg2.io": {
      "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
    }
  }
}

명령줄에서 필요한 키를 가져오도록 매개변수화되었습니다.

$ jq --arg key "reg2.io" '.auths |= with_entries(select(.key == $key))' file
{
  "auths": {
    "reg2.io": {
      "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
    }
  }
}

지정된 키를 삭제하려면 ==로 변경하세요 .!=

여러분의 시도는 문서에서 키가 어디에 있는지 구별할 수 없으므로 일반적인 경우에 약간의 혼란을 초래할 수 있습니다.


표현식에서 무슨 일이 일어나고 있는지에 대한 더 많은 설명을 추가하기만 하면 됩니다 jq.

with_entries()명령 에서 각각 a keyvalue키가 있는 다음 개체 집합이 표시됩니다.

{
   "key": "reg1.io",
   "value": { "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }
}
{
   "key": "reg2.io",
   "value": { "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" }
}
{
   "key": "reg3.io",
   "value": { "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" }
}

select()호출은 특정 테스트에 대한 각 개체를 추출합니다.진짜, 나머지는 폐기합니다. 우리의 테스트는 단순히 " key키의 값이 문자열입니까 reg2.io?"입니다.

호출 with_entries(expr)은 와 동일합니다 to_entries | map(expr) | from_entries.

관련 정보