2012-02-13 9 views
8

Quiero leer datos almacenados en un archivo. Todavía no he decidido qué formato almacenar, pero estoy buscando un formato que sea fácil de analizar. Inicialmente pensé que iría con JSON, pero parece que Java no tiene un analizador incorporado para JSON.Java Analizador de datos incorporado para JSON o XML o bien

Los datos almacenados serán un conjunto de registros, cada registro compuesto por un conjunto de campos. Por lo tanto, no es lo suficientemente simple para almacenarse en un archivo de texto que se puede leer línea por línea. Es por eso que creo que necesito algo como JSON. Pero no quiero agregar bibliotecas externas solo para analizar el formato. ¿Alguna sugerencia? Soy nuevo en Java.

+0

Aquí está la única solución de análisis JSON incorporada disponible en Java 8: http://stackoverflow.com/a/43667674/603516 – Vadzim

Respuesta

16

Si bien muchos Java no tienen una biblioteca de análisis estándar JSON, hay varias bibliotecas disponibles que son rápidas, confiables y fáciles de usar. Muchos también le permiten usar metodologías de enlace de objetos estándar, como JAXB, definir sus asignaciones de deserialización mediante anotaciones.

Yo prefiero Jackson. Google-GSon también es popular, y puede ver cómo algunas personas comparan los dos en este question.

Es posible que desee tener menos miedo de usar bibliotecas externas. Casi siempre es mejor aprovechar una biblioteca existente que tenga la funcionalidad que desea, en lugar de escribir la suya propia. Y con herramientas como Maven o Ivy para calcular automáticamente y descargar dependencias de la definición de su proyecto, realmente no hay razón para temer usar bibliotecas.

Dicho esto, con el estado actual del soporte XML de Java, debe encontrar XML igualmente accesible. This answer proporciona un ejemplo simple de usar javax.xml.parsers.DocumentBuilder para generar un DOM.

+0

Buena respuesta. También: http://xstream.codehaus.org/ –

1

Java proporciona SAXParser para analizar XML.

+2

Java SE proporciona: SAX ('javax.xml.parsers'), DOM (' javax.xml.parsers'), StAX ('javax.xm..stream') , JAXB ('javax.xml.bind') y XPath (' javax.xml.xpath') para analizar XML. –

6

estoy usando GSON: http://code.google.com/p/google-gson/ para analizar JSON, es muy fácil de usar:

Gson gson = new Gson(); 
String xyzAsString = gson.toJson(xyz); 

deserializar el uso de JSON:

Gson gson = new Gson(); 
Classname xyz = gson.fromJson(JSONedString, Classname.class); 

para más ejemplos por favor, mira aquí: https://sites.google.com/site/gson/gson-user-guide

+0

Tenga en cuenta que su ejemplo muestra la serialización de un objeto Java, y no el análisis como el que el cartel original estaba buscando hacer. – ironchefpython

+0

gracias, he modificado mi respuesta – wlk

1

Si está programando en netbeans puede usar dtd para generar e xml escáner. Simplemente haga clic en dtd archivo con el botón derecho del mouse y seleccione "Generar escáner DOM"

-1

JSON es genial, mejor que XML.

¿Por qué no quiere agregar bibliotecas externas? Si realmente no puede usar, puede volver a escribir un analizador. Simplemente implementar un analizador no es demasiado difícil.

+1

-1: "mejor que XML" en qué? Cada formato tiene fortalezas; sería más útil si elaboras en JSON. –

10

Como muchos otros han señalado, Java no envía una biblioteca estándar de análisis JSON como parte del JDK, por lo que si desea utilizar tecnología JDK-bundled con absolutamente ninguna dependencia, tiene 3 opciones de análisis XML:

  • XPathFactory - análisis basado en XPath. Lee todo el XML en una estructura de datos en memoria y le permite ejecutar consultas sobre ella usando XPath expression language. Esta es probablemente la memoria más lenta y más intensas, pero, una de las formas más convenientes para consultar sus datos.No deberías escribir una aplicación de negociación de acciones con esto, pero si solo necesitas datos de un gran archivo de configuración, es muy útil (aunque para las configuraciones, hay muchas otras librerías específicas para eso que son más fáciles de hacer que las tuyas) .
  • DocumentBuilder - Análisis basado en DOM. Lee el XML completo en una estructura de datos en memoria que puede consultar y recorrer según sea necesario. La segunda más lenta y bastante intensa en memoria, pero necesaria si desea/necesita que el DOM XML se quede en la memoria para que pueda operar en él. También es útil si quieres leer, consultar, hacer cambios y escribir el DOM como un archivo XML modificado.
  • SAXParser - Análisis basado en SAX. Casi el más rápido. Analiza a través de XML de arriba a abajo, llamando a métodos tropezados en su implementación ContentHandler (proporcionada en el tiempo de análisis) cada vez que se golpea el elemento apropiado. Básicamente es como una persona habladora que te dice todo lo que están haciendo COMO lo hacen. Depende de usted implementar los métodos apagados para hacer algo con los datos que le transmite tal como lo encuentra.
  • XMLStreamReader - Método de análisis más rápido y utiliza la menor sobrecarga. Este es el nuevo hijo de oro del análisis XML en Java. Es similar a STAX, pero en lugar de llamar a métodos tropezados cada vez que encuentra algo nuevo, rasga el archivo XML y notifica a la persona que llama de su estado modificado cuando ve contenido nuevo pero no hace nada CON el contenido hasta que lo solicite . Por ejemplo, dirá algo así como "Ahora estoy mirando una etiqueta abierta ... ahora una etiqueta cerrada ... ahora algunos caracteres ... ahora un comentario ..." y a menos que solicite información sobre esos elementos que está golpeando (obtener atributos, caracteres, etc.) que en realidad nunca analiza y los procesa fuera de la secuencia, simplemente se saltea.

AHORA, dicho todo esto, trabajar con estas API especialmente si eres nuevo no es el más intuitivo del mundo. Si ya has analizado XML antes en Java, estarás bien.

Sin embargo, si CONSIDERA un pequeño JAR de 3 ª parte, voy a señalarle en mi Simple Java XML Parser (SJXP) library. Le brinda la facilidad de XPath con el rendimiento del análisis STAX; Honestamente (estoy siendo imparcial, en serio) - es increíble.

Pasé más de un año trabajando en esto mientras escribía un sistema de análisis de alimentación realmente sólido que comenzó como un sistema basado en SAX, luego se trasladó a STAX y cuanto más trabajaba en él, más me daba cuenta de lo fácil que era podría resumir el dolor de STAX con reglas simples.

Puede mirar el Usage example, pero esencialmente define reglas para que coincidan como "/ library/book/title" analizará todos los contenidos de su etiqueta; puede analizar los atributos y valores pares calificados nombre del espacio (si es compatible con los espacios de nombres también!)

Aquí es un ejemplo feed RSS analizador:

IRule linkRule = new DefaultRule(Type.CHARACTER, "/rss/channel/item/link") { 
    @Override 
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) { 
     // Also store the link, or something equivalently fancy 
    } 
} 

A continuación, sólo tiene que pasar esa regla al analizador cuando se crea que, de esta manera:

XMLParser parser = new XMLParser(linkRule); 

y ya está; simplemente proporcione al analizador sus archivos XML a través del parse method y obtendrá devoluciones de llamadas cada vez que coincida con esa ruta.

He analizado, perfilado y optimizado la sobrecarga de la biblioteca sobre la cubierta de STAX hasta el punto de que es prácticamente inexistente. La coincidencia de parches real se realiza a través de códigos hash en caché, por lo que ni siquiera estoy haciendo comparaciones de cadenas dentro del analizador.

Es really fast y funciona en Android.

Si desea hacer JSON en su lugar, le recomiendo usar GSON. Jackson es más rápido, pero la API es 37 veces más compleja que la GSON API. Pasarás más tiempo averiguando exactamente qué clases necesitas usar en Jackson que con GSON.

También desde la última versión de GSON y la reescritura del analizador de flujo, la brecha de velocidad se ha cerrado bastante; puede utilizar la impl del analizador de flujo de ellos para obtener velocidades de análisis cercanas a Jackson si eso es crítico.

Dicho esto, si necesita una velocidad máxima por encima y más allá de cualquier cosa y esa es la prioridad n. ° 1, entonces use Jackson.

5

Ya has aceptado, pero parece que a todos les falta el hecho de que Java tiene tiene una biblioteca JSON estándar. Desde JDK 7 hay un paquete javax.json en la lib estándar.

+3

Es parte de JEE7, no en las bibliotecas estándar de JRE –

0

javax.json es el paquete de Java; tenga en cuenta también que existe una alternativa de Java extremadamente ligera a SAX, llamada StAX (Streaming API for XML).

JSON v XML en la aplicación que sugiere, en mi opinión, depende mucho más de lo que va a hacer con los datos y cómo va a procesarlos. Por ejemplo, si está enviando los datos a una página web y necesita usar notación de objetos para procesarlos usando JavaScript, entonces JSON es la opción obvia. Si solo desea mostrarlo, puede considerar XHTML y permita que su servidor elija lo que se muestra. Si está transfiriendo datos entre varias computadoras de la industria en aplicaciones B2B, es probable que necesiten usar XML y etiquetas definidas por los estándares de la industria.

Cuestiones relacionadas