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 ...
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 ...
Respuestas:
Usando la biblioteca org.json :
try {
JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
Log.d("Error", err.toString());
}
JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
Para cualquiera que todavía busque una respuesta:
JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);
import org.json.simple.JSONObject
parser.parse(
y quiere try-catch o throws. Pero cuando agrega cualquiera de los dos, da un Unhandled exception type ParseException
error o un error NoClassDefFound para ParseException org.json.simple.parser
incluso cuando tiene json-simple en dependencias de Maven y claramente visible en la biblioteca del proyecto.
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:
Hay varios serializadores y deserializadores Java JSON vinculados desde la página de inicio de JSON .
Al momento de escribir esto, existen estos 22:
- JSON-java .
- JSONUtil .
- jsonp .
- Json-lib .
- Stringtree .
- SOJO .
- json-taglib .
- Flexjson .
- Argo .
- jsonij .
- Fastjson .
- mjson .
- jjson .
- JSON-sencilla .
- json-io .
- google-GSON .
- FOSS Nova JSON .
- Maíz CONVERTIDOR .
- Apache johnzon .
- Genson .
- Cookjson .
- progbase .
... pero, por supuesto, la lista puede cambiar.
Solución Java 7
import javax.json.*;
...
String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()
;
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.
Cadena a JSON usando Jackson
con 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();
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.
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);
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(
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:
API de JsonNode : cómo usar, navegar, analizar y evaluar valores de un objeto JsonNode
Tutorial : tutorial simple sobre cómo usar Jackson para convertir cadenas JSON a JsonNode
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 InstanceCreator
que se requiere en GSON.
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"));
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
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;
}
Mejor Ve con una forma más simple usando org.json
lib. Simplemente haga un enfoque muy simple como a continuación:
JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");
Ahora obj
es su JSONObject
forma 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.
user.put("email", "someemail@mail.com")
desencadena una excepción no controlada.
try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}