Cómo convertir jsonString a JSONObject en Java

423

Tengo una variable de cadena llamada jsonString:

{"phonetype":"N95","cat":"WP"}

Ahora quiero convertirlo en objeto JSON. Busqué más en Google pero no obtuve ninguna respuesta esperada ...

Sr. Sajid Shaikh
fuente
1
No, está bien, porque quería crear un objeto json a partir de una cadena json, la respuesta dada por dogbane mostró el camino correcto para responder.
Sr. Sajid Shaikh
Ambas respuestas de Mappan y dogbane son correctas, pero utilizan módulos diferentes. Debe tener cuidado al importar el módulo correcto para cada uno porque hay muchos módulos JSONObject.
Arashsoft
Lo intenté con la biblioteca GSON. Por favor revise este enlace .
Thirumalvalavan
Aquí hay un video corto que muestra cómo crear un JSONObject en Java usando org.json.
drorw

Respuestas:

678

Usando la biblioteca org.json :

try {
     JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
     Log.d("Error", err.toString());
}
dogbane
fuente
77
Intenté con eso JSONObject js = new JSONObject (jsonstring); pero muestra error en jsonstring
Sr. Sajid Shaikh
29
recibió un error porque no está usando org.json, está usando google-gson que no funciona de esa manera.
Gubatron
2
@Gubatron Gracias amigo, tienes razón, acabo de descargarlo y hacer jar así que ahora funciona bien.
Sr. Sajid Shaikh
3
@dogbane ¿Qué pasa si no conozco la estructura de la cadena? Más claramente, ¿cómo puedo convertir un jsonString dinámico generado en jsonObject?
Saumyaraj
70
Usando google-gson puedes hacerlo así:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy
163

Para cualquiera que todavía busque una respuesta:

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);
Mappan
fuente
23
¿Y puede mencionar qué paquete importar para el mismo?
idophishing
10
Esto está funcionando para mí con:import org.json.simple.JSONObject
Mafro34
1
La versión 1.1.1 de json-simple parece tener algún problema. Lo anterior proporciona "Excepción no controlada" parser.parse(y quiere try-catch o throws. Pero cuando agrega cualquiera de los dos, da un Unhandled exception type ParseExceptionerror o un error NoClassDefFound para ParseException org.json.simple.parserincluso cuando tiene json-simple en dependencias de Maven y claramente visible en la biblioteca del proyecto.
Juha Untinen
2
org.json es una biblioteca de prueba de concepto. Es uno de los peores en términos de rendimiento y características. Uno debe mirar el conjunto de características y el rendimiento de una json lib antes de elegir. Vea este punto de referencia que hice usando JMH: github.com/fabienrenaud/java-json-benchmark Muestra claramente a Jackson más rápido que cualquier otra cosa y de 5 a 6 veces más rápido que org.json.
fabien
55
Analizador JSONParser = nuevo JSONParser (); parece depricated
Ouissal
46

Puedes usar google-gson. Detalles:

Ejemplos de objetos

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}

(Publicación por entregas)

BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj); 
==> json is {"value1":1,"value2":"abc"}

Tenga en cuenta que no puede serializar objetos con referencias circulares ya que eso dará como resultado una recursión infinita.

(Deserialización)

BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);  
==> obj2 is just like obj

Otro ejemplo para Gson:

Gson es fácil de aprender e implementar, debe saber cuáles son los dos métodos siguientes:

-> toJson () - convierte objetos java a formato JSON

-> fromJson () - convierte JSON en objeto java

import com.google.gson.Gson;

public class TestObjectToJson {
  private int data1 = 100;
  private String data2 = "hello";

  public static void main(String[] args) {
      TestObjectToJson obj = new TestObjectToJson();
      Gson gson = new Gson();

      //convert java object to JSON format
      String json = gson.toJson(obj);

      System.out.println(json);
  }

}

Salida

{"data1":100,"data2":"hello"}

Recursos:

Página de inicio del proyecto Google Gson

Guía del usuario de Gson

Ejemplo

kamaci
fuente
"Si solicita procesar en el lado del cliente, depende de su lenguaje de programación. Por ejemplo, con Java puede usar google-gson" Creo que probablemente quiso decir "servidor" en lugar de "cliente" allí. Y él etiquetó su pregunta "Java".
TJ Crowder
+1. He usado Gson en 4-5 proyectos ahora, en contextos muy diferentes, del lado del servidor y del cliente (también en la aplicación de Android), y nunca me ha fallado. Muy bonita y limpia lib.
Jonik
Si desea usar gson pero no tiene una clase POJO predefinida (es decir, tiene un json genérico sin una estructura predefinida), esta respuesta puede ayudar - stackoverflow.com/questions/4110664/…
Leandro David
24

Solución Java 7

import javax.json.*;

...

String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()

;

RSG
fuente
55
Esta biblioteca tiene el peor rendimiento de todos. Vea este punto de referencia que hice con JMH: github.com/fabienrenaud/java-json-benchmark
fabien
15

Para convertir Stringen JSONObjectsólo tiene que pasar a la Stringinstancia en Constructor deJSONObject .

P.ej:

JSONObject jsonObj = new JSONObject("your string");
Charu
fuente
10

Me gusta usar google-gson para esto, y es precisamente porque no necesito trabajar con JSONObject directamente.

En ese caso, tendría una clase que correspondería a las propiedades de su objeto JSON

class Phone {
 public String phonetype;
 public String cat;
}


...
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
Gson gson = new Gson();
Phone fooFromJson = gson.fromJson(jsonString, Phone.class);
...

Sin embargo, creo que su pregunta es más como, ¿Cómo termino con un objeto JSONObject real de una cadena JSON?

Estaba mirando la api de google-json y no pude encontrar nada tan directo como la api de org.json, que es probablemente lo que quieres usar si necesitas usar un JSONObject básico.

http://www.json.org/javadoc/org/json/JSONObject.html

Con org.json.JSONObject (otra API completamente diferente) Si quieres hacer algo como ...

JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
System.out.println(jsonObject.getString("phonetype"));

Creo que la belleza de google-gson es que no necesitas tratar con JSONObject. Simplemente agarra json, pasa la clase en la que quieres deserializar y tus atributos de clase coincidirán con el JSON, pero, de nuevo, todos tienen sus propios requisitos, tal vez no puedas permitirte el lujo de tener clases pre-mapeadas en el lado deserializador porque las cosas pueden ser demasiado dinámicas en el lado generador de JSON. En ese caso, solo use json.org.

Gubatron
fuente
8

debes importar org.json

JSONObject jsonObj = null;
        try {
            jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
        } catch (JSONException e) {
            e.printStackTrace();
        }
Cabezas
fuente
8

Cadena a JSON usando Jacksoncon com.fasterxml.jackson.databind:

Suponiendo que su cadena json representa así: jsonString = {"phonetype": "N95", "cat": "WP"}

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * Simple code exmpl
 */
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonString);
String phoneType = node.get("phonetype").asText();
String cat = node.get("cat").asText();
Yugerten
fuente
3

Si está utilizando http://json-lib.sourceforge.net (net.sf.json.JSONObject)

es bastante facil:

String myJsonString;
JSONObject json = JSONObject.fromObject(myJsonString);

o

JSONObject json = JSONSerializer.toJSON(myJsonString);

obtenga los valores luego con json.getString (param), json.getInt (param) y así sucesivamente.

El ro
fuente
JSONObject json = JSONSerializer.toJSON (myJsonString); producirá un error de tipo que no coincide con el otro funciona
Henrique C.
3

Para convertir una cadena a json y la picadura es como json. {"phonetype": "N95", "cat": "WP"}

String Data=response.getEntity().getText().toString(); // reading the string value 
JSONObject json = (JSONObject) new JSONParser().parse(Data);
String x=(String) json.get("phonetype");
System.out.println("Check Data"+x);
String y=(String) json.get("cat");
System.out.println("Check Data"+y);
Aravind Cheekkallur
fuente
¿Qué es JSONParser? ¿Es solo parte del proveedor de contactos?
IgorGanapolsky
1
@IgorGanapolsky JSONParser es una opción integrada proporcionada por JSON simple. Para hacer esto, incluya json-simple-1.1.1.jar
Aravind Cheekkallur
3

Utilice JsonNode de rapidxml para el análisis genérico de Json. Crea internamente un Mapa de valores clave para todas las entradas.

Ejemplo:

private void test(@RequestBody JsonNode node)

cadena de entrada:

{"a":"b","c":"d"}
Vishnu
fuente
2

No es necesario usar ninguna biblioteca externa.

Puede usar esta clase en su lugar :) (maneja incluso listas, listas anidadas y json)

public class Utility {

    public static Map<String, Object> jsonToMap(Object json) throws JSONException {

        if(json instanceof JSONObject)
            return _jsonToMap_((JSONObject)json) ;

        else if (json instanceof String)
        {
            JSONObject jsonObject = new JSONObject((String)json) ;
            return _jsonToMap_(jsonObject) ;
        }
        return null ;
    }


   private static Map<String, Object> _jsonToMap_(JSONObject json) throws JSONException {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JSONObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }


    private static Map<String, Object> toMap(JSONObject object) throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }


    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
}

Para convertir su cadena JSON a hashmap use esto:

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(
Natesh Bhat
fuente
2

Codehaus Jackson : he sido esta increíble API desde 2012 para mi servicio web RESTful y las pruebas JUnit. Con su API, puedes:

(1) Convertir cadena JSON a Java Bean

public static String beanToJSONString(Object myJavaBean) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.writeValueAsString(myJavaBean);
}

(2) Convertir cadena JSON a objeto JSON (JsonNode)

public static JsonNode stringToJSONObject(String jsonString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readTree(jsonString);
}

//Example:
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";   
JsonNode jsonNode = stringToJSONObject(jsonString);
Assert.assertEquals("Phonetype value not legit!", "N95", jsonNode.get("phonetype").getTextValue());
Assert.assertEquals("Cat value is tragic!", "WP", jsonNode.get("cat").getTextValue());

(3) Convertir Java Bean a JSON String

    public static Object JSONStringToBean(Class myBeanClass, String JSONString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readValue(JSONString, beanClass);
}

REFS:

  1. Codehaus Jackson

  2. API de JsonNode : cómo usar, navegar, analizar y evaluar valores de un objeto JsonNode

  3. Tutorial : tutorial simple sobre cómo usar Jackson para convertir cadenas JSON a JsonNode

Panini Luncher
fuente
1

TENGA EN CUENTA que GSON con la deserialización de una interfaz dará como resultado una excepción como la siguiente.

"java.lang.RuntimeException: Unable to invoke no-args constructor for interface XXX. Register an InstanceCreator with Gson for this type may fix this problem."

Mientras se deserializa; GSON no sabe qué objeto debe ser identificado para esa interfaz.

Esto se resuelve de alguna manera aquí .

Sin embargo, FlexJSON tiene esta solución inherentemente. mientras serializa el tiempo, agrega el nombre de la clase como parte de json como se muestra a continuación.

{
    "HTTPStatus": "OK",
    "class": "com.XXX.YYY.HTTPViewResponse",
    "code": null,
    "outputContext": {
        "class": "com.XXX.YYY.ZZZ.OutputSuccessContext",
        "eligible": true
    }
}

Entonces JSON será un poco engorroso; pero no necesita escribir lo InstanceCreatorque se requiere en GSON.

Kanagavelu Sugumar
fuente
1

Usando org.json

Si tiene una cadena que contiene texto en formato JSON, puede obtener un objeto JSON siguiendo estos pasos:

String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
JSONObject jsonObj = null;
    try {
        jsonObj = new JSONObject(jsonString);
    } catch (JSONException e) {
        e.printStackTrace();
    }

Ahora para acceder al tipo de teléfono

Sysout.out.println(jsonObject.getString("phonetype"));
Azhar Zafar
fuente
0

Para configurar json solo objeto a la lista, es decir

"locations":{

}

dentro List<Location>

utilizar

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

jackson.mapper-asl-1.9.7.jar

usuario3012570
fuente
0

Convertir cadenas a objetos Json usando org.json.simple.JSONObject

private static JSONObject createJSONObject(String jsonString){
    JSONObject  jsonObject=new JSONObject();
    JSONParser jsonParser=new  JSONParser();
    if ((jsonString != null) && !(jsonString.isEmpty())) {
        try {
            jsonObject=(JSONObject) jsonParser.parse(jsonString);
        } catch (org.json.simple.parser.ParseException e) {
            e.printStackTrace();
        }
    }
    return jsonObject;
}
Anzar Ansari
fuente
-1

Mejor Ve con una forma más simple usando org.jsonlib. Simplemente haga un enfoque muy simple como a continuación:

JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");

Ahora objes su JSONObjectforma convertida de su respectiva cadena. Esto es así si tiene pares nombre-valor.

Para una cadena, puede pasar directamente al constructor de JSONObject. Si será válido json String, entonces está bien, de lo contrario arrojará una excepción.

TheLittleNaruto
fuente
Literalmente haciendo lo que escribió: user.put("email", "[email protected]")desencadena una excepción no controlada.
Sebastialonso
1
@Sebastialonso Sí, debes atrapar la excepción. Así:try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
TheLittleNaruto
@vidya No, no lo es. Considere compararlo nuevamente.
TheLittleNaruto
@vidya Sure Dude
TheLittleNaruto