평면화된 중첩 json 객체 데이터의 형식을 지정하는 unix 명령

평면화된 중첩 json 객체 데이터의 형식을 지정하는 unix 명령

입력 데이터 형식 json 예

data: {
   div1: {
      name: "some name",
      age: number,
      address_1: "some address",
      items: {
         item_x1: "some data",
         ..
         ..
      }
   }
   ..
   ..
}

예상 결과는 flatten json 형식이어야 합니다.

{ "data.div1.name":"some name",..., "data.div1.items.item_x1":"some data",...},
..
..
{ "data.divN.name":"some name",... }

필드를 알 수 없을 수도 있습니다! 따라서 필터링 명령을 활성화할 필요가 없습니다!

UNIX 기반 명령에 대한 아이디어가 있습니까?

답변1

구경하다그로엔. 링크된 페이지에서:

JSON을 grepable하게 만드세요!

gron원하는 항목을 더 쉽게 파악하고 이에 대한 절대 "경로"를 확인할 수 있도록 JSON을 개별 할당으로 변환하세요. 대량의 JSON을 반환하지만 제대로 문서화되지 않은 API 탐색을 단순화합니다.

▶ gron "https://api.github.com/repos/tomnomnom/gron/commits?per_page=1" | fgrep "commit.author"
json[0].commit.author = {};
json[0].commit.author.date = "2016-07-02T10:51:21Z";
json[0].commit.author.email = "[email protected]";
json[0].commit.author.name = "Tom Hudson";

gron은 역방향으로도 작동하여 필터링된 데이터를 다시 JSON으로 변환할 수 있습니다.

▶ gron "https://api.github.com/repos/tomnomnom/gron/commits?per_page=1" | fgrep "commit.author" | gron --ungron
[
  {
    "commit": {
      "author": {
        "date": "2016-07-02T10:51:21Z",
        "email": "[email protected]",
        "name": "Tom Hudson"
      }
    }
  }
]

답변2

JqJSON 데이터 작업에 적합한 도구입니다(https://stedolan.github.io/jq/manual/v1.5/).

샘플 input.json:

{
  "data": {
    "div1": {
      "name": "some name",
      "age": 1,
      "address_1": "some address",
      "items": {
        "item_x1": "some data"
      }
    },
    "div2": {
      "name": "some other name",
      "age": 2,
      "address_2": "some address",
      "items": {
        "item_x2": "some data"
      }
    },
    "div3": {
      "name": "another name",
      "age": 3,
      "address_3": "some address",
      "items": {
        "item_x3": "some data"
      }
    }
  }
}

jq -c '"data" as $main_k | .data as $data | .data | to_entries
       | group_by(.key) | map(from_entries)[] | [paths(scalars)]
       | map(("\($main_k)." + join(".")) as $key
             | {($key): (reduce .[] as $k ($data; . = .[$k]))})
       | add' input.json

산출:

{"data.div1.name":"some name","data.div1.age":1,"data.div1.address_1":"some address","data.div1.items.item_x1":"some data"}
{"data.div2.name":"some other name","data.div2.age":2,"data.div2.address_2":"some address","data.div2.items.item_x2":"some data"}
{"data.div3.name":"another name","data.div3.age":3,"data.div3.address_3":"some address","data.div3.items.item_x3":"some data"}

관련 정보