56 votos

¿Cuáles son las buenas herramientas de línea de comandos para JSON?

Problema General

A pesar de que yo podría ser el diagnóstico de la causa raíz de un evento, determinar el número de usuarios afectados, y la destilación de la temporización de los registros con el fin de evaluar el funcionamiento y rendimiento del impacto de un reciente cambio en el código, mis herramientas de la misma estancia,: grep, awk, sed, tr, uniq, sort, zcat, tail, head, joiny split. Para pegar todos juntos, Unix nos da tuberías, y para el aficionado filtrado tenemos xargs. Si estos me falla, siempre hay perl -e.

Estas herramientas son perfectas para el procesamiento de archivos CSV, delimitado por tabulaciones, archivos de registro con una previsible formato de línea, o archivos separados por comas pares clave-valor. En otras palabras, los archivos donde cada línea tiene casi nada de contexto.

XML Análogos

He necesitado de arrastre a través de Gigabytes de XML para construir un histograma de uso por usuario. Esto fue bastante fácil con las herramientas que tenía, pero para la más complicada de las consultas de los métodos normales se rompen. Decir que tengo los archivos con artículos como este:

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

Y digamos que yo quiero para producir una asignación de usuario número promedio de <baz>s por <foo>. Procesamiento de línea-por-línea ya no es una opción: necesito saber que usuario <foo> actualmente estoy inspeccionando lo sé cuyo promedio de actualizar. Cualquier tipo de Unix uno forro que lleva a cabo esta tarea es probable que sea inescrutable.

Afortunadamente en XML de la tierra, tenemos maravillosas tecnologías como XPath, XQuery, y XSLT para ayudarnos.

Previamente, yo había acostumbrado a la utilización de la maravillosa XML::XPath módulo de Perl para realizar consultas como la de arriba, pero después de encontrar un TextMate Plugin que podría ejecutar una expresión XPath en contra de mi ventana actual, he dejado de escribir uno de los scripts de Perl para la consulta de XML. Y me acabo de enterar sobre XMLStarlet que se está instalando como yo escriba esto y que espero poder usar en el futuro.

JSON Soluciones?

Así que esto me lleva a mi pregunta: ¿existen herramientas como esta para JSON? Es sólo una cuestión de tiempo antes de que algunos tarea de investigación me obliga a hacer consultas similares en archivos JSON, y sin herramientas como XPath y XSLT, dicha tarea será mucho más difícil. Si yo tuviera un montón de JSON que se veía así:

{
  "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" }
  ]
}

Y quería encontrar el promedio de número de números de teléfono de cada persona que había, yo podría hacer algo como esto con XPath:

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

Preguntas

  1. Existen herramientas de línea de comandos que puede "consulta" JSON archivos en este manera?
  2. Si usted tiene que procesar un montón de JSON archivos en una línea de comandos de Unix, ¿qué herramientas utiliza?
  3. Diablos, hay incluso una labor que se realiza para hacer un lenguaje de consulta como esta para JSON?
  4. Si usted hace uso de herramientas como esta en el día a día de trabajo, ¿qué gusta/no me gusta acerca de ellos? Hay cualquier artimañas?

Estoy notando más y más de serialización de datos se realiza mediante JSON, por lo que el procesamiento de estas herramientas será crucial a la hora de analizar gran cantidad de datos volcados en el futuro. Las bibliotecas de idioma para JSON son muy fuertes y es bastante fácil para escribir secuencias de comandos para hacer este tipo de transformación, pero para realmente dejar que la gente juegue con los datos de shell son las herramientas necesarias.

Preguntas Relacionadas Con La

51voto

Brian Tingle Puntos 386

Acabo de encontrar esto:

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

"jq es un ligero y flexible de la línea de comandos JSON procesador".

2014 actualización:

@user456584 mencionado:

También existe la 'json' comando (por ejemplo, 'jsontool'). Tiendo a preferir sobre jq. Muy UNIX-y. Aquí hay un enlace al proyecto: github.com/trentm/json –

en la json LÉAME en http://github.com/trentm/json hay una larga lista de cosas similares

7voto

Dave Dopson Puntos 16690

He creado un módulo diseñado específicamente para la línea de comandos JSON manipulación:

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

example.png

  • FLEXIBLE - LA "suiza-ejército-cuchillo" herramienta para el procesamiento de datos JSON - puede ser utilizado como un simple bastante de la impresora, o como una plena potencia de Javascript de la línea de comandos
  • POTENTE - Expone toda la potencia y funcionalidad de underscore.js (más el carácter de subrayado.cadena)
  • SIMPLE - Hace que sea sencillo para escribir JS uno-trazadores de líneas similar a la utilización de "perl-pe"
  • ENCADENADO - el comando Varios invokations pueden ser encadenados juntos para crear una canalización de procesamiento de datos
  • MULTI-FORMATO Rico de apoyo para la entrada / salida de formatos - pretty-printing, estricta JSON, etc [muy pronto]
  • DOCUMENTADO - Excelente línea de comandos de la documentación con múltiples ejemplos de cada comando

Esto te permite hacer cosas poderosas realmente fácil:

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

Tiene un muy buen ayuda de línea de comandos del sistema y es extremadamente flexible. Está bien probado y listo para su uso; sin embargo, todavía estoy construyendo algunas de las características como las alternativas para el formato de entrada y salida, y la fusión en mi plantilla manejo de la herramienta (ver TODO.md). Si usted tiene cualesquiera peticiones de características, comentario en este post o agregar un problema en github. He diseñado un muy amplio conjunto de funciones, pero yo estaría encantado de dar prioridad a las características que se necesitan por parte de los miembros de la comunidad.

5voto

azatoth Puntos 1783

Una manera en que usted podría hacer es convertir a XML. Usos siguientes dos módulos de perl (JSON y XML::Simple) para hacer volar-por conversión:

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

que por su ejemplo de json termina como:

<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>

4voto

chmeee Puntos 288

Echa un vistazo a este loco proyecto jsawk. Es el diseño para filtrar a través de JSON de entrada de la línea de comandos. Compruebe resty , así como para una línea de comandos RESTO de cliente que puede utilizar en tuberías que pueden venir muy bien.

2voto

Dimitre Novatchev Puntos 147842

Eche un vistazo a la f:json-document() de la FXSL 2.x de la biblioteca.

El uso de esta función es muy fácil de incorporar JSon y utilizarla como... XML.

Por ejemplo, uno puede escribir la siguiente expresión XPath:

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

y todos los niños de Students con sex = 'Female'

Aquí está el ejemplo completo:

<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>

Cuando la transformación se aplica en cualquier documento XML (se omite), el resultado es el correcto producido:

<Smith>
   <First_Name>Mary</First_Name>
   <sex>Female</sex>
</Smith>
<Jackson>
   <First_Name>Jackie</First_Name>
   <sex>Female</sex>
</Jackson>

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X