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


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());
}

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

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


"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



15

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

P.ej:

JSONObject jsonObj = new JSONObject("your string");

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.


8

debes importar org.json

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

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();

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.


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

¿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"}

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(

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


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.


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"));

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


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

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


Literalmente haciendo lo que escribió: user.put("email", "someemail@mail.com")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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.