¿Convertir una cadena JSON en un objeto en Java ME?

116

¿Hay alguna forma en Java / J2ME de convertir una cadena, como:

{name:"MyNode", width:200, height:100}

a una representación de Objeto interno del mismo, en una línea de código?

Porque el método actual es demasiado tedioso:

Object n = create("new");
setString(p, "name", "MyNode");
setInteger(p, "width", 200);
setInteger(p, "height", 100);

¿Quizás una biblioteca JSON?

El flash
fuente
6
Su cadena no es realmente un objeto Json, consulte el estándar Json ... Es más como una notación JavaScript.
PhiLho
19
@Jeremy Rudd: Debería ser{"name":"MyNode", "width":200, "height":100}
Esteban Küber
1
@voyager: Lo sé, pero JavaScript admite de forma nativa nombres de propiedades sin comillas.
TheFlash
1
@PhiLho: Lo sé, pero lo mantuve de esta manera en aras de la claridad. El resaltador de sintaxis SO lo habría estropeado. Nombre y valor en rojo.
TheFlash
¿Hay alguna forma de realizar la conversión utilizando las API principales de Java? ¿Quizás en Java 8? Java 9?
AlikElzin-kilaka

Respuestas:

108

Usé algunos de ellos y mi favorito es,

http://code.google.com/p/json-simple/

La biblioteca es muy pequeña, por lo que es perfecta para J2ME.

Puede analizar JSON en un objeto Java en una línea como esta,

JSONObject json = (JSONObject)new JSONParser().parse("{\"name\":\"MyNode\", \"width\":200, \"height\":100}");
System.out.println("name=" + json.get("name"));
System.out.println("width=" + json.get("width"));
Codificador ZZ
fuente
1
¿Puedo usar esta biblioteca en un applet? Si usa Reflection, me enfrentaré a un error de permiso de reflejo. ¿Funcionaría?
Mridang Agarwalla
¿JsonSimple todavía tiene la clase JSONParser? No puedo llamar a la clase.
phuwin
JSONParser ahora está obsoleto.
Varda Elentári
79

La opción más simple es Jackson :

MyObject ob = new ObjectMapper().readValue(jsonString, MyObject.class);

Hay otras bibliotecas igualmente sencillas de usar (ya se mencionó a Gson); pero algunas opciones son más laboriosas, como la biblioteca org.json original, que requiere que cree un "JSONObject" intermedio incluso si no los necesita.

StaxMan
fuente
Jackson no es compatible con J2ME
skue el
Es cierto, si j2me todavía está aproximadamente en el nivel JDK 1.4 (Jackson requiere 1.5)
StaxMan
1
Solo tienes 2 incrementos, pero mereces más. Jackson fue muy fácil de conectar a nuestra aplicación. Gracias por recomendar
Dan Doyon
1
Jackson también puede deserializar a un objeto simple. p.ej. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye
Más ejemplos de código usando Jackson: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo
61

GSON es una buena opción para convertir un objeto java en un objeto json y viceversa.
Es una herramienta proporcionada por google.

para convertir json a java object use: fromJson(jsonObject,javaclassname.class)
para convertir java object a json object use: toJson(javaObject)
y el resto se hará automáticamente

Para obtener más información y para descargar

Alok Vaish
fuente
1
+1 ¡Estaba buscando algo similar y esto encaja perfectamente!
Roy Tang
23

Puede hacer esto fácilmente con Google GSON.

Supongamos que tiene una clase llamada Usuario con los campos usuario, ancho y alto y desea convertir la siguiente cadena json en el objeto Usuario.

{"name":"MyNode", "width":200, "height":100}

Puede hacerlo fácilmente, sin tener que lanzar (teniendo en cuenta el comentario de nimcap;)), con el siguiente código:

Gson gson = new Gson(); 
final User user = gson.fromJson(jsonString, User.class);

Donde jsonString es la cadena JSON anterior.

Para obtener más información, consulte https://code.google.com/p/google-gson/

sufinawaz
fuente
3
Y sí, me doy cuenta de que la pregunta se hizo hace 4 años, pero mi respuesta es para las partes interesadas que necesitan hacer esto en este momento :) ¡Espero que ayude a alguien!
sufinawaz
22

Tiene muchos analizadores JSON para Java :

  • JSONObject.java
    Un JSONObject es una colección desordenada de pares de nombre / valor. Su forma externa es una cadena envuelta en llaves con dos puntos entre los nombres y los valores y comas entre los valores y los nombres. La forma interna es un objeto que tiene métodos get () y opt () para acceder a los valores por nombre, y métodos put () para agregar o reemplazar valores por nombre. Los valores pueden ser de cualquiera de estos tipos: Boolean, JSONArray, JSONObject, Number y String, o el objeto JSONObject.NULL.

  • JSONArray.java
    Un JSONArray es una secuencia ordenada de valores. Su forma externa es una cadena envuelta entre corchetes con comas entre los valores. La forma interna es un objeto que tiene métodos get () y opt () para acceder a los valores por índice, y métodos put () para agregar o reemplazar valores. Los valores pueden ser de cualquiera de estos tipos: Boolean, JSONArray, JSONObject, Number y String, o el objeto JSONObject.NULL.

  • JSONStringer.java
    Un JSONStringer es una herramienta para producir rápidamente texto JSON.

  • JSONWriter.java
    Un JSONWriter es una herramienta para escribir rápidamente texto JSON en transmisiones.

  • JSONTokener.java
    Un JSONTokener toma una cadena de origen y extrae caracteres y tokens de ella. Lo utilizan los constructores JSONObject y JSONArray para analizar las cadenas de origen JSON.

  • JSONException.java
    Se lanza una JSONException cuando se detecta un error de sintaxis o de procedimiento.

  • JSONString.java
    JSONString es una interfaz que permite a las clases implementar su serialización JSON.

Esteban Küber
fuente
1
Si J2ME tiene java.io.IOException; java.io.Writer; java.lang.reflect.Field; java.lang.reflect.Modifier; java.lang.reflect.Method; java.util.Collection; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.TreeSet ;, entonces podrías usar la primera, ya que son javaclases simples .
Esteban Küber
2
Creo que no hay un paquete java.lang.reflect en MIDP 2.0. Hará difícil hacer un analizador genérico ...
PhiLho
2
Chico inteligente, viajero, acabas de copiar la documentación de las clases estándar de Java JSON.
TheFlash
@Jeremy Rudd: por supuesto que sí, ¿cómo pensaste que lo hice tan rápido? No fue un intento de engañarte, es una práctica estándar tanto vincular como copiar. Lo siento si salió de esa manera.
Esteban Küber
10
Bajé la votación porque no responde a la pregunta. Está dando una lista de clases relacionadas, pero ninguna de ellas logra realmente lo que quiere el solicitante.
Jeff Martin
7

El sitio oficial JSON es donde debes mirar. Proporciona varias bibliotecas que se pueden usar con Java, yo personalmente he usado esta, JSON-lib, que es una implementación del trabajo en el sitio, por lo que tiene exactamente la misma clase, métodos, etc. en esta página .

Si hace clic en los enlaces html allí, puede encontrar lo que desee.

En breve:

para crear un objeto json y una matriz json, el código es:

JSONObject obj = new JSONObject();
obj.put("variable1", o1);
obj.put("variable2", o2);
JSONArray array = new JSONArray();
array.put(obj);

o1, o2, pueden ser tipos primitivos (long, int, boolean), Strings o Arrays.

El proceso inverso es bastante simple, me refiero a convertir una cadena en un objeto / matriz json.

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

Para ser analizado correctamente, solo tiene que saber si está analizando una matriz o un objeto.

tzik
fuente
5

Como muchos ya han dicho, una forma bastante simple de hacer esto usando JSON.simple como se muestra a continuación

import org.json.JSONObject;

String someJsonString = "{name:"MyNode", width:200, height:100}";
JSONObject jsonObj = new JSONObject(someJsonString);

Y luego use jsonObj para lidiar con JSON Object. por ejemplo, jsonObj.get ("nombre");

Según el siguiente enlace, JSON.simple muestra una eficiencia constante para archivos JSON pequeños y grandes

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/

Kripz
fuente
Escribiste que muchos ya declararon la sugerencia que publicaste. ¿Cuál es la esencia de tu respuesta?
Dakab
1
@dakab Gracias por tus comentarios. La esencia de esta pregunta era dar una línea de código que cumpliera el propósito. Y dado que hay muchas apis disponibles para hacer esto, solo quería brindar información adicional sobre la comparación de la eficiencia de las apis. Entonces, la esencia de esta respuesta que quise decir fue brindarle al código + algo de información sobre la comparación de las eficiencias de las diferentes apis mencionadas por otros compañeros en este hilo.
Kripz
3

JSON IO es, con mucho, la forma más fácil de convertir una cadena JSON o un flujo de entrada JSON en un objeto Java

Cadena a objeto Java
Object obj = JsonReader.jsonToJava("[\"Hello, World\"]");

https://code.google.com/p/json-io/

Josué Alejandro Ibarra
fuente
3

Esta es una pregunta antigua y json-simple ( https://code.google.com/p/json-simple/ ) podría ser una buena solución en ese momento, pero tenga en cuenta que el proyecto parece no estar activo por un tiempo.

Sugiero el Gson que ahora está alojado en: https://github.com/google/gson

Si el rendimiento es su problema, puede echar un vistazo a algunos puntos de referencia http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ que se comparan.

Alireza Fattahi
fuente
2

Escribí una biblioteca que usa json.org para analizar JSON, pero en realidad creará un proxy de una interfaz para usted. El código / JAR está en code.google.com.

http://fixjures.googlecode.com/

No sé si funciona en J2ME. Dado que usa Java Reflection para crear proxies, creo que no funcionará. Además, actualmente tiene una fuerte dependencia de las colecciones de Google que quiero eliminar y probablemente sea demasiado pesado para sus necesidades, pero le permite interactuar con sus datos JSON de la manera que está buscando:

interface Foo {
    String getName();
    int getWidth();
    int getHeight();
}

Foo myFoo = Fixjure.of(Foo.class).from(JSONSource.newJsonString("{ name : \"foo name\" }")).create();
String name = myFoo.getName(); // name now .equals("foo name");
Steve Reed
fuente
Increíble, aunque no quiero a Foo, solo el Objeto nativo.
TheFlash
2

Simplemente cree un objeto Json en java con la siguiente cadena Json.

{name:"MyNode", width:200, height:100}

si lo anterior es su cadena Json, simplemente cree un Objeto Json con él.

JsonString ="{name:"MyNode", width:200, height:100}";
JSONObject yourJsonObject = new JSONObject(JsonString);
System.out.println("name=" + yourJsonObject.getString("name"));
System.out.println("width=" + yourJsonObject.getString("width"));
RAM
fuente
2

Jackson para archivos grandes, GSON para archivos pequeños y JSON.simple para manejar ambos.

Thanga
fuente
1
evidencia para respaldar el comentario de @ thanga desde aquí blog.takipi.com/…
Gob00st
También he visto eso antes, pero también considero que los archivos pequeños son rápidos de analizar de todos modos. Solo pensaría en JSON.simple si tiene una TONELADA de archivos pequeños para analizar dónde se sumará ese 30% o más de diferencia sobre Jackson. También vea los comentarios principales allí, ese punto de referencia puede no ser demasiado confiable. Realmente, si la velocidad es tan importante para usted, probablemente debería diseñar de manera que pueda inyectar un analizador para cambiar las implementaciones fácilmente y hacer sus propias pruebas de referencia.
Usuario