Katıştırılmış (alıntı yapılan) json dizesini json'a dönüştürme


22

Jackson'ı ayrıştırmak için "jq" ile tanıştım.

Özelliklerden birinin kendisinin bir json dizesi olduğu bir json yanıtı üreten bir hizmetle çalışıyorum. Bu alıntılanan değeri geçerli bir json dizgisine nasıl dönüştürebilirim, böylece daha sonra jq ile işleyebilirim?

Örneğin, düz yazdırılmış düz jsonunu "jq" dan görüntülerseniz, çıktının kısa bir kısmı:

"someJsonString": "{\"date\":\"2018-01-08\", ...

Bu özelliğin değerini elde etmek için jq kullanabilirim, ancak "unescaping" yaparak alıntılanan dizgiyi geçerli bir json'a dönüştürmem gerekiyor.

Galiba açılışı ve çift tırnak işaretini sonlandırarak ve tüm ters eğik çizgileri (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'") kaldırarak onu boruya sokabiliyorum . Bu iş gibi görünüyor, ancak bu en sağlam çözüm gibi görünmüyor.

Güncelleme :

Yaptıklarımı biraz daha açıklığa kavuşturmak için, işte denedim ne olduğunu gösteren birkaç örnek:

% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...

Güncelleme :

İşte tamamen bağımsız bir örnek:

% cat stuff.json | jq .
{
  "stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}"
% cat stuff.json | jq '.stuff' | jq .
"{\"date\":\"2018-01-08\"}"

Güncelleme :

Bu son çıktıyı gerçek bir jq ifadesiyle işlemeyi denediysem, şöyle bir şey yapar:

% cat stuff.json | jq '.stuff' | jq '.date'
assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position
Aborted (core dumped)

String özelliğinin yalnızca değerini jqalmak için kullanırsanız , çıkmadan döndürür mü? Eğer öyleyse, sadece taze içine boru . jq
DopeGhoti

Hayır, çıkmadan geri döndürmez. Mesele bu.
David M. Karr

Ne dersiniz echo $(jq statement here)?
DopeGhoti

Hayır, değişiklik yok.
David M. Karr

@ DavidM.Karr, tamam, Mümkünse - girişinizi asıl önemli dize ve nihai sonuçla
genişletin

Yanıtlar:


20

Bunun için bir rawbayrak var

    -r      output raw strings, not JSON texts;

jq -rc .stuff stuff.json

Çıktı

{"date":"2018-01-08"}

Aradaki fark Roman'ın cevabında geçerli JSON çıktısı veya geçerli JSON değilse hata mesajlarını almanızın garantisidir.
Kusalananda

Geçerli nokta, ancak bu otomasyonda kullanılıyorsa, aniden geçerli bir json çıktısına sahip olmamanın olağandışı olacağını düşünüyorum. En uygun form hemen hemen her zaman mükemmel olacaktır. Bununla birlikte, daha kesin yöntemler hakkında bilmek hala iyidir.
David M. Karr

@ DavidM.Karr "olağandışı aniden geçerli json çıktısına sahip değil" HA! Riiiight. Otomasyonda hata işleme? Hatalar asla olmayacak! Neden rahatsız ediyorsun?
Bruno Bronosky

Bu, jqdaha fazla JSON işlemi için başkalarına boru döşemeyi gerektirir , oysa Roman'ın yaklaşımıyla aynı jqifadeye devam edebilirsiniz .
Raman

1
@ cricket_007: jq 1.5 ile çalıştı ve çalışmadığını doğruladı: jq -rc '.stuff.date'üretti jq: error (at <stdin>:0): Cannot index string with string "date". Ancak: iyi .stuff | fromjson | .dateçalışıyor.
Raman

26

İle jqbireyin fromjsonfonksiyonu:

Örnek stuff.jsoniçerik:

{
  "stuff": "{\"date\":\"2018-01-08\"}"
}

jq -c '.stuff | fromjson' stuff.json

Çıktı:

{"date":"2018-01-08"}

Bu gereksiz görünüyor. Sağlanan alternatif cevap
cricket_007
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.