Unix komut satırı JSON ayrıştırıcısı? [kapalı]


128

Bir boru hattındaki JSON yanıtından gelen değerleri incelemek için kullanılabilecek bir Unix (kendi tarzınızı seçin) JSON ayrıştırıcısı önerebilir mi?


Pythonpy kullanmayı seviyorum ( github.com/russell91/pythonpy ): cat a.json | py --ji -x 'x.attr'
RussellStewart



1
Kasabada yeni bir araç var: Ramda'nın curried api'sini ve LiveScript kısa sözdizimini kullanan ramda -cli . Json'u girdi ve oluşturma işlevleri olarak almak için oluşturulmuştur. npm install -g ramda-cli
Ehvince

Yanıtlar:


18

Perl çekirdeğinde yerleşik modülleri kullanarak bu komut satırı ayrıştırıcısını (isterseniz bir bash takma adına koyabilirsiniz) kullanabilirsiniz:

perl -MData::Dumper -MJSON::PP=from_json -ne'print Dumper(from_json($_))'

1
Bunun çıktısı beni şaşırttı. Çıktı, tuşlar ve değerler arasında kalın oklar (=>) içerir. Bu JSON değil.
Landon Kuhn

7
@landon: hayır, giriş JSON'dur ve çıktı yerel bir Perl veri yapısıdır, daha sonra gerekirse daha fazla değişiklik yapmaya devam edebilirsiniz. Bu tek satırlık yazının amacı, okunması çok daha kolay veriler üretmesidir.
Ether

1
Bir JSON çıktısı istiyorsanız, bu Perl tek perl -e "use JSON; print to_json( decode_json(<>), { pretty => 1 } )"
Georgy Vladimirov

233

python -m json.toolVarsayılan olarak çoğu * nix işletim sisteminde varsayılan olarak mevcut görünen tercih ediyorum .

$ echo '{"foo":1, "bar":2}' | python -m json.tool
{
    "bar": 2, 
    "foo": 1
}

Not: Python sürümünüze bağlı olarak , tüm anahtarlar alfabetik olarak sıralanabilir ve bu iyi bir şey olabilir veya olmayabilir. Python 2 ile anahtarları sıralama varsayılandı, python 3.5+ sürümünde ise bunlar artık otomatik olarak sıralanmıyor, ancak açıkça anahtara göre sıralama seçeneğiniz var:

$ echo '{"foo":1, "bar":2}' | python3 -m json.tool --sort-keys
{
    "bar": 2, 
    "foo": 1
}

5
Yetersiz cevap. Hedef, belirli bir JSON dosyasını geçerli JSON içerdiğini doğrulamaksa, bu güzel bir komut satırı alternatifidir.
scorpiodawg

10
bu cevap, belirtilen anahtarın değerlerinin nasıl inceleneceğini açıklamadı.
Colin Su

8
@ColinSu ama bu da asıl soru değildi. json.tooljson yazdırmak için sadece kısa bir el. Bir kabuk betiğinde json verilerini çıkarmanız / işlemeniz gerekiyorsa jq, ne
işe

1
IMMO bu yanlış bir cevaptır çünkü python json.toolsadece iki şey yapar: json doğrulamak ve oldukça yazdırmak. Json'daki değerlerin jqyaptığı gibi iç gözlem YAPMAZ .
Devy

1
@AdityaSriram'ı bilmek güzel! … Bu bilgiyi yanıta ekleyecek.
muhqu

144

Taşınabilir bir C derlenmiş aracı arıyorsanız:

http://stedolan.github.com/jq/

Web sitesinden:

jq, JSON verileri için sed gibidir - yapılandırılmış verileri, sed , awk , grep ile aynı kolaylıkla dilimlemek, filtrelemek, eşlemek ve dönüştürmek için kullanabilirsiniz. ve arkadaşların metinle oynamanıza izin .

jq, sahip olduğunuz veri formatını çok az çabayla istediğiniz formata dönüştürebilir ve bunu yapacak program genellikle beklediğinizden daha kısa ve basittir.

Öğretici : http://stedolan.github.com/jq/tutorial/
Manual : http://stedolan.github.com/jq/manual/
İndir : http://stedolan.github.com/jq/download/


20
Buradaki en iyi cevap imo. Ağır bağımlılıklar yok, küçük, güçlü, iyi belgeler ve denemek için bir esinti. Bunu önerdiğiniz için çok teşekkürler!
FrozenCow

Ubuntu / Debian'da bunu yapabilirsiniz apt install jq.
Pablo A

Bunu birkaç ay önce sordum ve sevmeyi öğrendim jq.
Jé Queue

63

Komut satırı JSON manipülasyonu için özel olarak tasarlanmış bir modül oluşturdum:

https://github.com/ddopson/underscore-cli

  • ESNEK - JSON verilerini işlemek için "İsviçre çakısı" aracı - basit bir güzel yazıcı veya tam güçlü bir Javascript komut satırı olarak kullanılabilir
  • GÜÇLÜ - undercore.js'nin (artı altçizgi.string) tüm gücünü ve işlevselliğini ortaya çıkarır
  • BASİT - "perl -pe" kullanmaya benzer JS tek satırlı yazımları yazmayı kolaylaştırır
  • ZİNCİRLİ - Bir veri işleme hattı oluşturmak için birden fazla komut çağrısı birlikte zincirlenebilir
  • ÇOK BİÇİMİ - Giriş / çıkış formatları için zengin destek - oldukça baskı, sıkı JSON vb. [Çok yakında]
  • DOCUMENTED - Her komut için birden fazla örnek içeren mükemmel komut satırı dokümantasyonu

Güçlü şeyleri gerçekten kolayca yapmanızı sağlar:

cat earthporn.json | underscore select '.data .title'
# [ 'Fjaðrárgljúfur canyon, Iceland [OC] [683x1024]',
#   'New town, Edinburgh, Scotland [4320 x 3240]',
#   'Sunrise in Bryce Canyon, UT [1120x700] [OC]',
# ...
#   'Kariega Game Reserve, South Africa [3584x2688]',
#   'Valle de la Luna, Chile [OS] [1024x683]',
#   'Frosted trees after a snowstorm in Laax, Switzerland [OC] [1072x712]' ]

cat earthporn.json | underscore select '.data .title' | underscore count
# 25

underscore map --data '[1, 2, 3, 4]' 'value+1'
# prints: [ 2, 3, 4, 5 ]

underscore map --data '{"a": [1, 4], "b": [2, 8]}' '_.max(value)'
# [ 4, 8 ]

echo '{"foo":1, "bar":2}' | underscore map -q 'console.log("key = ", key)'
# key = foo
# key = bar

underscore pluck --data "[{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]" name
# [ 'moe', 'larry', 'curly' ]

underscore keys --data '{name : "larry", age : 50}'
# [ 'name', 'age' ]

underscore reduce --data '[1, 2, 3, 4]' 'total+value'
# 10

Ayrıca mevcut en iyi "akıllı boşluk" JSON biçimlendiricilerinden birine sahiptir:

Herhangi bir özellik talebiniz varsa, bu gönderiye yorum yapın veya github'a bir sorun ekleyin. Topluluk üyelerinin ihtiyaç duyduğu özelliklere öncelik vermekten memnuniyet duyarım.


Müthiş! Ancak, JSON verileri üzerinde konsol komutları çalıştırmak mümkün müdür? Örneğin: URL dizisine sahip bir JSON dosyası verildiğinde, wgether URL.
Camilo Martin

@CamiloMartin - bunu yapmanın en kolay yolu, URL'leri her satıra bir URL yazdırmak ve ardından bunu xargs veya GNU paralel üzerinden çalıştırmaktır.
Dave Dopson

@DaveDopson underscoreİç içe yerleştirilmiş nesneler ve diziler içeren iç içe geçmiş json'u ayrıştırmak için kullanabilir miyim ?
user227666

1
@ user227666 - tabii. JSON, birçok düzeydeki nesnenin iç içe yerleştirilmesini destekler. Veya daha fazla JSON'u kodlayan bir dizeye sahip JSON'u kastediyor olabilirsiniz. Bu da işe yarıyor, ancak biraz parçalama gerektiriyor.
Dave Dopson

@DaveDopson Alt çizgi desteği "bir" desen "içerir, yani. belirli bir "anahtar" için olası (büyük / küçük harf yerine konmayan) değerler kümesi? "Jq" yi eşleşmeyle denedim ama işe yaramıyor. Ayrıca tam kullanım durumumu burada yayınladı - stackoverflow.com/questions/25463196/…
ekta

13

Checkout TickTick .

Gerçek bir Bash JSON ayrıştırıcısıdır.

#!/bin/bash
. /path/to/ticktick.sh

# File
DATA=`cat data.json`
# cURL
#DATA=`curl http://foobar3000.com/echo/request.json`

tickParse "$DATA"

echo ``pathname``
echo ``headers["user-agent"]``

Kabuk düzeyindeki araçları
sevmeliyim

12

Ubuntu'da kurulumu kolay: sudo apt-get install python-pip && sudo pip install jsonpipe
activout.se

@ divideandconquer.se Üzgünüz ama bu aracı npm kullanarak kuruyorsunuz npm install json.
gitaarik

@rednaw Ne yazık ki NPM jsonpaketi artık tamamen farklı bir paket tarafından ele geçirilmiş görünüyor.
Brad

8

Jshon veya JSON.sh'den bahseden var mı?

https://github.com/keenerd/jshon

boru json'u buna yönlendirir ve json nesnelerini geçerek geçerli nesnenin yolunu (JSON dizisi olarak) ve sonra nesneyi boşluksuz olarak yazdırır.

http://kmkeen.com/jshon/
Jshon, stdin'den json metni yükler, eylemler gerçekleştirir, ardından stdout'taki son eylemi görüntüler ve ayrıca olağan metin işleme hattının bir parçası olarak yapılmıştır.


OSX'te Örnek kullanım: brew install jshon,cat *.json | jshon
kenorb

2

Sen deneyebilirsiniz jsawk önerildiği üzere bu cevap .

Gerçekten bunu yapmak için hızlı bir python betiği hazırlayabilirsiniz.


1

İçin Bash / Python , burada piton etrafa bir temel sarıcı simplejson:

json_parser() {
    local jsonfile="my_json_file.json"
    local tc="import simplejson,sys; myjsonstr=sys.stdin.read(); "`
            `"myjson=simplejson.loads(myjsonstr);"
    # Build python print command based on $@
    local printcmd="print myjson"
    for (( argn=1; argn<=$#; argn++ )); do
        printcmd="$printcmd['${!argn}']"
    done
    local result=$(python -c "$tc $printcmd.keys()" <$jsonfile 2>/dev/null \
        || python -c "$tc $printcmd" <$jsonfile 2>/dev/null)
    # For returning space-separated values
    echo $result|sed -e "s/[]|[|,|']//g"
    #echo $result 
}

Gerçekten yalnızca iç içe geçmiş sözlük stilini işler, ancak ihtiyacım olan şey için çalışıyor ve json'da yürümek için kullanışlıdır. Muhtemelen tadına göre uyarlanabilir.

Her neyse, başka bir dış bağımlılıktan kaynaklanmak istemeyenler için evde yetiştirilen bir şey. Tabii ki python hariç.

Ör. json_parser {field1} {field2}çalışır print myjson['{field1}']['{field2}']ve {field2}boşlukla ayrılmış anahtarları veya ilişkili değerleri verir .


0

Büyük json nesnelerini kolayca keşfetmek için yaptığım küçük bir komut satırı json gezgini olan jkid'i yeni yaptım . Nesneler "enine" olarak keşfedilebilir ve konsol taşmasını önlemek için bir "önizleme" seçeneği vardır.

$  echo '{"john":{"size":20, "eyes":"green"}, "bob":{"size":30, "eyes":"brown"}}' > test3.json
$  jkid . eyes test3.json 
object[.]["eyes"]
{
  "bob": "brown", 
  "john": "green"
}

Mac'e nasıl kurabilirim jkid?
user227666
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.