Jakie są dobre narzędzia CLI dla JSON?

Problem Ogólny

Chociaż mogę diagnozować przyczynę zdarzenia, określać liczbę użytkowników, których dotyczy zdarzenie, lub destylować dzienniki czasowe w celu oceny wpływu ostatniej zmiany kodu na wydajność i przepustowość, moje narzędzia pozostają takie same: grep, awk, sed, tr, uniq, sort, zcat, tail, head, join, i split. Aby je wszystkie skleić, Unix daje nam rury, A do filtrowania mamy xargs. Jeśli mnie zawiodą, zawsze będzie perl -e.

Te narzędzia są idealne do przetwarzania plików CSV, plików rozdzielanych tabulatorami, plików dziennika z przewidywalnym formatem wiersza lub plików z oddzielonymi przecinkami parami klucz-wartość. Innymi słowy, pliki, w których każda linia nie ma żadnego kontekstu.

Analogi XML

Ostatnio musiałem przeszukiwać gigabajty XML, aby zbudować histogram użycia przez użytkownika. Było to dość łatwe z narzędziami, które miałem, ale dla bardziej skomplikowanych zapytań normalne podejścia załamują się. Powiedz, że mam pliki z takimi elementami:

<foo user="me">
    <baz key="zoidberg" value="squid" />
    <baz key="leela"    value="cyclops" />
    <baz key="fry"      value="rube" />
</foo>

I powiedzmy, że chcę stworzyć mapowanie od użytkownika do średniej liczby <baz>s na <foo>. Przetwarzanie linii po linii nie wchodzi już w grę: muszę wiedzieć, którego użytkownika <foo> aktualnie sprawdzam, więc wiem, czyja średnia do aktualizacji. Każdy rodzaj Unix one liner, który spełni to zadanie, może być niezrozumiały.

Na szczęście w XML-land mamy wspaniałe technologie, takie jak XPath, XQuery i XSLT, aby pomóc my.

Wcześniej przyzwyczaiłem się do używania wspaniałego XML::XPath modułu Perla do wykonywania zapytań takich jak powyższy, ale po znalezieniu wtyczki TextMate, która mogłaby uruchomić wyrażenie XPath w moim bieżącym oknie, przestałem pisać jednorazowe Skrypty Perla do zapytań XML. I właśnie dowiedziałem się o XMLStarlet który instaluje się podczas pisania tego i który z niecierpliwością czekam na użycie w przyszłości.

JSON Solutions?

Więc to prowadzi mnie do mojego pytanie: czy są jakieś takie narzędzia dla JSON? To tylko kwestia czasu, zanim jakieś zadanie będzie wymagało ode mnie wykonania podobnych zapytań na plikach JSON, a bez takich narzędzi jak XPath i XSLT, takie zadanie będzie o wiele trudniejsze. Gdybym miał kilka JSON ' ów, które wyglądałyby tak:

{
  "firstName": "Bender",
  "lastName": "Robot",
  "age": 200,
  "address": {
    "streetAddress": "123",
    "city": "New York",
    "state": "NY",
    "postalCode": "1729"
  },
  "phoneNumber": [
    { "type": "home", "number": "666 555-1234" },
    { "type": "fax", "number": "666 555-4567" }
  ]
}

I chciałem znaleźć średnią liczbę numerów telefonów, które każda osoba miała, mogłem zrobić coś takiego z XPath:

fn:avg(/fn:count(phoneNumber))

Pytania

  1. czy są jakieś polecenia narzędzia które mogą "odpytywać" pliki JSON w tym sposób?
  2. jeśli musisz przetworzyć kilka Pliki JSON w uniksowej linii poleceń, jakich narzędzi używasz?
  3. Heck, czy jest w ogóle wykonywana praca aby stworzyć taki język zapytań dla JSONA?
  4. jeśli używasz takich narzędzi w Twoja codzienna praca, co robisz lubisz/nie lubisz ich? Są tam jakieś Gotcha?

Zauważam, że coraz więcej serializacji danych odbywa się za pomocą JSON, więc takie narzędzia przetwarzania będą ma kluczowe znaczenie przy analizowaniu dużych zrzutów danych w przyszłości. Biblioteki językowe dla JSON są bardzo silne i łatwo jest pisać skrypty do tego rodzaju przetwarzania, ale aby naprawdę pozwolić ludziom bawić się narzędziami powłoki danych są potrzebne.

Podobne Pytania

Author: Community, 2010-05-29

6 answers

Właśnie znalazłem to:

Http://stedolan.github.com/jq/

"jq jest lekkim i elastycznym procesorem JSON linii poleceń."

2014 Aktualizacja:

@user456584 napisał (a):

Istnieje również polecenie 'json' (np. 'jsontool'). Wolę to niż jq. Bardzo UNIKSOWO. oto link do projektu: github.com/trentm/json –

W json README at http://github.com/trentm/json jest długa lista podobnych rzeczy

 47
Author: Brian Tingle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-01 18:29:41

Stworzyłem moduł specjalnie zaprojektowany do manipulacji JSON wiersza poleceń:

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

  • [12]} FLEXIBLE - narzędzie "swiss-army-knife" do przetwarzania danych JSON-może być używane jako prosta drukarka pretty-printer lub jako pełna linia poleceń Javascript
  • potężny - eksponuje pełną moc i funkcjonalność podkreślenia.js (plus podkreślam.string)
  • SIMPLE - ułatwia pisanie jednowierszowych JS podobnych do używania "perl-pe"
  • przykuta - wiele wywołań poleceń może być połączonych łańcuchowo, aby utworzyć rurociąg przetwarzania danych
  • MULTI-FORMAT - bogate wsparcie dla formatów wejścia / wyjścia-pretty-printing, strict JSON, etc [już wkrótce]
  • DOCUMENTED - doskonała dokumentacja wiersza poleceń z wieloma przykładami dla każdego polecenie

Pozwala naprawdę łatwo robić potężne rzeczy:

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

Ma bardzo ładny system pomocy wiersza poleceń i jest niezwykle elastyczny. Jest dobrze przetestowany i gotowy do użycia; jednak nadal buduję kilka funkcji, takich jak alternatywy dla formatu wejścia/wyjścia i scalanie w moim narzędziu do obsługi szablonów (zobacz TODO.md jeśli masz jakieś prośby o funkcje, skomentuj ten post lub dodaj problem w github. Zaprojektowałem dość obszerny feature-set, ale chętnie ustalę priorytety funkcji, które są potrzebne członkom społeczności.

 7
Author: Dave Dopson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 20:50:07

Jednym ze sposobów jest przekonwertowanie go na XML. Następnie używa dwóch modułów Perla (JSON i XML::Simple) do konwersji fly-by:

cat test.json | perl -MJSON -MXML::Simple -e 'print XMLout(decode_json(do{local$/;<>}),RootName=>"json")'

Które dla Twojego przykładu json kończy się jako:

<json age="200" firstName="Bender" lastName="Robot">
  <address city="New York" postalCode="1729" state="NY" streetAddress="123" />
  <phoneNumber number="666 555-1234" type="home" />
  <phoneNumber number="666 555-4567" type="fax" />
</json>
 5
Author: azatoth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-29 00:03:37

Spójrz na ten szalony projekt jsawk . Jest przeznaczony do filtrowania przez wejście JSON z linii poleceń. Sprawdź resty jak również dla klienta REST wiersza poleceń, którego możesz użyć w potokach, które mogą się przydać.

 4
Author: chmeee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-03 09:11:08

Ostatnio odkryłem, że JSON może być łatwo eval-ed z Pythonem:

$ python -c "json=eval(open('/json.txt').read()); print len(json['phoneNumber'])"
2

Chociaż metoda oczywiście nie powiedzie się, jeśli wejście JSON zawiera null.

 3
Author: newtover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 10:23:05

Spójrz na f:json-document() z FXSL 2.biblioteka x.

Korzystanie z tej funkcji jest niezwykle łatwe do włączenia JSon i używać go tak samo... XML.

Na przykład, można po prostu zapisać następujące wyrażenie XPath:

f:json-document($vstrParam)/Students/*[sex = 'Female']

I get all children of Students with sex = 'Female'

Oto pełny przykład:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:f="http://fxsl.sf.net/"
 exclude-result-prefixes="f xs"
 >
 <xsl:import href="../f/func-json-document.xsl"/>

 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vstrParam" as="xs:string">
{

  "teacher":{
    "name":
      "Mr Borat",
    "age":
      "35",
    "Nationality":
      "Kazakhstan"
             },


  "Class":{
    "Semester":
      "Summer",
    "Room":
      null,
    "Subject":
      "Politics",
    "Notes":
      "We're happy, you happy?"
           },

  "Students":
    {
      "Smith":
        {"First Name":"Mary","sex":"Female"},
      "Brown":
        {"First Name":"John","sex":"Male"},
      "Jackson":
        {"First Name":"Jackie","sex":"Female"}
    }
    ,


  "Grades":

    {
      "Test":
      [
        {"grade":"A","points":68,"grade":"B","points":25,"grade":"C","points":15},

        {"grade":"C","points":2, "grade":"B","points":29, "grade":"A","points":55},

        {"grade":"C","points":2, "grade":"A","points":72, "grade":"A","points":65}
       ]
    }


}
 </xsl:variable>

 <xsl:template match="/">
    <xsl:sequence select=
     "f:json-document($vstrParam)/Students/*[sex = 'Female']"/>

 </xsl:template>
</xsl:stylesheet>

Gdy powyższa transformacja zostanie zastosowana do dowolnego dokumentu XML (ignorowanego), powstaje poprawny wynik :

<Smith>
   <First_Name>Mary</First_Name>
   <sex>Female</sex>
</Smith>
<Jackson>
   <First_Name>Jackie</First_Name>
   <sex>Female</sex>
</Jackson>
 2
Author: Dimitre Novatchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-29 01:15:33