JSON Dizesini ayrıştırmak için jq kullanın


91

jqJSON yapısını şu şekilde ayrıştırmaya çalışıyorum :

{
  "a" : 1,
  "b" : 2,
  "c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}

Yani, JSON'daki bir öğe, çıkış karakterli json içeren bir dizedir.

Yani, şu çizgide bir şeyim var: $ jq [.c] myFile.json | jq [.id]

Ama bu çöküyor jq: error: Cannot index string with string

Bunun nedeni .c'nin çıktısının JSON değil, bir dize olmasıdır. Jq'nin bu dizeyi ayrıştırmasını nasıl sağlayabilirim?

Benim ilk çözüm, tüm kaçış karakter değiştirmek için sed kullanmak için ( \":\", \",\"ve \") ama yüzüne gözüne bulaştırarak, ben yerleşik bir yolu vardır varsayalım jqbunu yapmak için?

Teşekkürler!

düzenleme: Ayrıca, burada bulunan jq sürümü:

$ jq --version
jq version 1.3

Sanırım gerekirse güncelleyebilirim.


Bu soru aynı zamanda şunu arıyorsanız da yardımcı olur: "jq kullanarak json dizgisinden nasıl çıkılır?"
k0pernikus

Yanıtlar:


172

jq bunun için fromjsonyerleşiktir:

jq '.c | fromjson | .id' myFile.json

fromjson 1.4 sürümünde eklendi.


2
Teşekkür ederim. Bu çalışıyor. Bu cevabı daha 'deyimsel' hissettiğim için kabul edeceğim. Şerefe.
Colin Grogan

@ColinGrogan lütfen yapın.
vbence

@ColinGrogan: Özelliğin bulunmadığı jq 1.3 sürümünü kullandığınızı sorunuza açıkça yazmış olduğunuz için kabul edilen yanıtı değiştirmek için herhangi bir neden görmüyorum fromjson. Yani bu cevap ilginç olsa da soruyu cevaplamıyor.
Casimir et Hippolyte

Bunu bir json dosyasında kullanmak mümkün mü (.id özelliğini belirtmeden)?
Florian Castelain

1
@FlorianCastelain evet, ya atlayın ya da nokta: kullanın jq 'fromjson | .' myfile, "{\"key\":1, \"word\":\"cat\"}"

42

Karakterlerin görünümünü kaldıracak ham çıktıyı (-r) kullanabilirsiniz:

jq -r .c myfile.json | jq .id

ADDENDUM: Bu, jq 1.3 ve sonrasında çalışması avantajına sahiptir; gerçekten de jq'nin -r seçeneğine sahip her sürümünde çalışmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.