fallo convertir cannot json xslt command-line xpath

convertir - json to xml xslt



¿Cuáles son las buenas herramientas de CLI para JSON? (6)

Acabo de encontrar esto:

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

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

Actualización 2014:

@ user456584 mencionado:

También está el comando ''json'' (por ejemplo, ''jsontool''). Tiendo a preferirlo a jq. Muy UNIX-y. Aquí hay un enlace al proyecto: github.com/trentm/json -

en el json README en http://github.com/trentm/json hay una larga lista de cosas similares

Problema general

Aunque pueda estar diagnosticando la causa raíz de un evento, determinar cuántos usuarios afectó o destilar registros de tiempo para evaluar el rendimiento y el impacto en el rendimiento de un cambio de código reciente, mis herramientas siguen siendo las mismas: grep , awk , sed , tr , uniq , sort , zcat , tail , head , join y split . Para unirlos todos, Unix nos da tubos, y para un filtrado más elegante tenemos xargs . Si esto me falla, siempre habrá perl -e .

Estas herramientas son perfectas para procesar archivos CSV, archivos delimitados por tabuladores, archivos de registro con un formato de línea predecible o archivos con pares de valores-clave separados por comas. En otras palabras, archivos en los que cada línea no tiene ningún contexto.

Analogos XML

Recientemente necesité navegar 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 consultas más complicadas los enfoques normales se rompen. Digamos que tengo archivos con elementos como este:

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

Y digamos que quiero producir un mapeo del usuario al número promedio de <baz> s por <foo> . El procesamiento línea por línea ya no es una opción: necesito saber qué <foo> usuario estoy inspeccionando actualmente, así que sé de quién es el promedio para actualizar. Cualquier tipo de trazador de líneas de Unix que realiza esta tarea es probable que sea inescrutable.

Afortunadamente en XML-land, contamos con tecnologías maravillosas como XPath, XQuery y XSLT para ayudarnos.

Anteriormente, me había acostumbrado a utilizar el maravilloso XML::XPath Perl para realizar consultas como la anterior, pero después de encontrar un complemento de TextMate que podía ejecutar una expresión XPath en mi ventana actual , dejé de escribir scripts Perl únicos para consulta XML. Y acabo de XMLStarlet de XMLStarlet que está instalando mientras XMLStarlet esto y que espero usar en el futuro.

¿JSON Solutions?

Entonces esto me lleva a mi pregunta: ¿hay herramientas como esta para JSON? Es solo cuestión de tiempo antes de que alguna tarea de investigación me obligue a hacer consultas similares en archivos JSON, y sin herramientas como XPath y XSLT, tal tarea será mucho más difícil. Si 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 la cantidad promedio de números de teléfono que tenía cada persona, podría hacer algo como esto con XPath:

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

Preguntas

  1. ¿Hay alguna herramienta de línea de comandos que pueda "consultar" archivos JSON de esta manera?
  2. Si tiene que procesar un grupo de archivos JSON en una línea de comandos de Unix, ¿qué herramientas usa?
  3. Diablos, ¿se está trabajando para hacer un lenguaje de consulta como este para JSON?
  4. Si usa herramientas como esta en su trabajo diario, ¿qué le gusta / disgusta de ellas? ¿Hay algún problema?

Me doy cuenta de que se está haciendo más y más serialización de datos usando JSON, por lo que procesar herramientas como esta será crucial cuando se analicen volcados de datos grandes en el futuro. Las bibliotecas de idiomas para JSON son muy potentes y es bastante fácil escribir guiones para realizar este tipo de procesamiento, pero para que realmente las personas jueguen con las herramientas de shell de datos se necesitan.

preguntas relacionadas


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

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

  • FLEXIBLE : la herramienta "swiss-army-knife" para procesar datos JSON: se puede usar como una simple impresora bonita o como una línea de comando de JavaScript de máxima potencia
  • POTENTE - Expone toda la potencia y funcionalidad de underscore.js (más underscore.string)
  • SIMPLE - Hace que escribir JS one-liners sea simple, similar al uso de "perl -pe"
  • ENCADENADO : las invociones de comandos múltiples se pueden encadenar juntas para crear una canalización de procesamiento de datos
  • MULTI-FORMAT - Soporte enriquecido para formatos de entrada / salida: impresión bonita, JSON estricto, etc. [próximamente]
  • DOCUMENTADO - Excelente documentación de línea de comandos con múltiples ejemplos para cada comando

Te permite hacer cosas poderosas muy fácilmente:

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 sistema de ayuda de línea de comandos muy agradable y es extremadamente flexible. Está bien probado y listo para usar; sin embargo, todavía estoy desarrollando algunas de las características como alternativas para el formato de entrada / salida, y la fusión en mi herramienta de manejo de plantillas (vea TODO.md). Si tiene alguna solicitud de función, comente esta publicación o agregue un problema en github. He diseñado un conjunto de características bastante extenso, pero me gustaría priorizar las características que necesitan los miembros de la comunidad.


Echa un vistazo a este loco proyecto jsawk . Está diseñado para filtrar a través de la entrada JSON desde la línea de comandos. Verifique resty también para un cliente REST de línea de comando que puede usar en tuberías que pueden ser útiles.


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

Usando esta función es extremadamente fácil incorporar JSon y usarlo como ... XML.

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

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

y obtener todos los hijos 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 se aplica la transformación anterior en cualquier documento XML (ignorado), se produce el resultado correcto :

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


Recientemente descubrí que JSON puede evaluarse fácilmente con Python:

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

Aunque el método obviamente fallará si la entrada JSON contiene nulos.


Una forma de hacerlo es convertirlo a XML. A continuación se utilizan dos módulos de Perl (JSON y XML :: Simple) para realizar la conversión de pasaje:

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

que para su ejemplo 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>