Como obter o caminho da chave javascript em arquivos json longos no Linux

1

Estou usando várias chaves de um longo objeto javascript, representado como json. Exemplo:

...
"stock": {
  "type": 'str',
  "properties": {
    "warehouse": {
      "type": 123
    },
    "retail": {
      "type": false
    }
  }
}
...

Eu gostaria de saber o caminho completo, por exemplo, da chave type . Algo como get-paht type getting root.somethingElse.stock.properties.retail.type sem ter que fazer isso manualmente. Este é um arquivo longo, e pesquisar para cima e para baixo não parece produtivo ...

As ferramentas de ferramentas Cli ou Gui estão bem. No entanto, não consigo encontrar nenhum aplicativo, extensão ou ferramenta de linha de comando que retorne isso.

Eu tentei "JsonView" para o Chrome, mas não consegui carregar um arquivo local.

jq Também não parece resolver isso, já que faltam algumas aspas duplas.

EDIT: Eu percebi que este era um objeto js, embora representado como json.

    
por Fernando César 03.02.2017 / 11:02

1 resposta

1

Começando com um corretamente formado e um MWE completo:

{
  "stock": {
    "type": "str",
    "properties": {
      "warehouse": {
        "type": 123
      },
      "retail": {
        "type": false
      }
    }
  }
}

Em seguida, use jq (v1.5):

$ jq -M -c 'path(..|.type?//empty) | join(".")' mwe.json
"stock.type"
"stock.properties.warehouse.type"

(adicione -r para omitir aspas na saída, -M e -c são apenas para formatar a saída). Isso recorre pela estrutura ( .. ) procurando por um índice ou chave de "tipo", suprime erros ( ? ) quando isso não é apropriado e avalia como "vazio" ( // ) quando o valor é falso ou null, então nivela ( join() ) o array de caminho.

Um possível problema é que um valor false (ou nulo) aciona empty (pelo menos na v1.5, mas não na v1.4) e o item stock.properties.retail.type é omitido.

Sem o | join(".") , você receberá matrizes JSON, o que também pode ser útil:

["stock","type"]
["stock","properties","warehouse","type"]

Uma versão mais complexa, incluindo os valores:

$ jq -M -c '[paths(.|select(type=="object" and has("type")) )][] \
            as $path | [$path+["type"], getpath($path + ["type"])]' mwe.json  
[["stock","type"],"str"]
[["stock","properties","warehouse","type"],123]
[["stock","properties","retail","type"],false]

Isto é um pouco mais elegante, cria um array selecionando todos os objetos que possuem um filho "type", depois imprime o caminho para "type" e seu valor.

    
por 03.02.2017 / 13:08