¿Cómo devuelve un objeto JSON desde un Servlet Java?

153

¿Cómo se devuelve un objeto JSON desde un servlet Java?

Anteriormente, cuando hacía AJAX con un servlet, devolvía una cadena. ¿Hay un tipo de objeto JSON que necesita ser utilizado, o simplemente devuelve una cadena que se parece a un objeto JSON, por ejemplo?

String objectToReturn = "{ key1: 'value1', key2: 'value2' }";
Ankur
fuente
10
Nitpick; ¿No deberías querer más { key1: value1, key2: value2 }?
14
Nitpick: lo que realmente quiere es {"clave1": "valor1", "clave2": "valor2"} ... :-)
PhiLho
@Ankur revisa el enlace si decidiste usar Spring 3.2.0.
AmirHd
55
Nitpick: no debemos suponer que los valores son cadenas, por lo que lo que realmente quiere es {"clave1": valor1, "clave2": valor2}
NoBrainer
Estos Nitpicks (especialmente en este orden), son épicos :)
Ankur

Respuestas:

57

Hago exactamente lo que sugieres (devuelve a String).

Sin embargo, puede considerar configurar el tipo MIME para indicar que está devolviendo JSON (de acuerdo con esta otra publicación de stackoverflow es "application / json").

Mark Elliot
fuente
175

Escriba el objeto JSON en la secuencia de salida del objeto de respuesta.

También debe establecer el tipo de contenido de la siguiente manera, que especificará lo que está devolviendo:

response.setContentType("application/json");
// Get the printwriter object from response to write the required json object to the output stream      
PrintWriter out = response.getWriter();
// Assuming your json object is **jsonObject**, perform the following, it will return your json object  
out.print(jsonObject);
out.flush();
user241924
fuente
77
Esto me ayudo. Como se menciona en la respuesta de Mark Elliot, jsonObject podría ser solo una cadena formateada como json. Recuerde usar comillas dobles, ya que las comillas simples no le darán un json válido. Ej .:String jsonStr = "{\"my_key\": \"my_value\"}";
marcelocra
3
Será bueno usar response.setCharacterEncoding ("utf-8"); también
erhun
81

Primero convierta el objeto JSON a String. Luego, escríbalo al escritor de respuestas junto con el tipo de contenido application/jsony la codificación de caracteres de UTF-8.

Aquí hay un ejemplo asumiendo que está usando Google Gson para convertir un objeto Java en una cadena JSON:

protected void doXxx(HttpServletRequest request, HttpServletResponse response) {
    // ...

    String json = new Gson().toJson(someObject);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(json);
}

Eso es todo.

Ver también:

BalusC
fuente
Estoy haciendo esto para enviar una respuesta a JavaScript y mostrar la respuesta en alerta. por qué muestra el código html dentro de la alerta ... ¿por qué recibo el código html como respuesta? Hice exactamente lo mismo que dijiste.
Abhi
Tengo el mismo problema que @iLive
Wax
30

¿Cómo devuelve un objeto JSON desde un Servlet Java?

response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();

  //create Json Object
  JsonObject json = new JsonObject();

    // put some value pairs into the JSON object .
    json.addProperty("Mobile", 9999988888);
    json.addProperty("Name", "ManojSarnaik");

    // finally output the json string       
    out.print(json.toString());
MAnoj Sarnaik
fuente
Dependiendo de la versión, JsonObject es abstracto. Creé una respuesta a una implementación más nueva.
Rafael Barros
8

Simplemente escriba una cadena en la secuencia de salida. Puede configurar el tipo MIME en text/javascript( editar : application/jsonaparentemente es oficial) si se siente útil. (Hay una pequeña pero distinta probabilidad de que algún día evite que algo lo estropee, y es una buena práctica).


fuente
8

Gson es muy útil para esto. más fácil incluso. Aquí está mi ejemplo:

public class Bean {
private String nombre="juan";
private String apellido="machado";
private List<InnerBean> datosCriticos;

class InnerBean
{
    private int edad=12;

}
public Bean() {
    datosCriticos = new ArrayList<>();
    datosCriticos.add(new InnerBean());
}

}

    Bean bean = new Bean();
    Gson gson = new Gson();
    String json =gson.toJson(bean);

out.print (json);

{"nombre": "juan", "apellido": "machado", "datosCriticos": [{"edad": 12}]}

Tengo que decirle a las personas que si los vars están vacíos cuando usas gson, no construirán el json por ti.

{}

superusuario
fuente
8

Usé Jackson para convertir objetos Java en cadenas JSON y enviar de la siguiente manera.

PrintWriter out = response.getWriter();
ObjectMapper objectMapper= new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(MyObject);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
out.print(jsonString);
out.flush();
ravthiru
fuente
7

Puede haber un objeto JSON para conveniencia de codificación Java. Pero, por fin, la estructura de datos se serializará en cadena. Establecer un tipo MIME adecuado sería bueno.

Sugeriría JSON Java de json.org .

nulo
fuente
Incorrecto. Por lo general, no hay ninguna razón para agregar una sobrecarga de la construcción de un String- la salida debe ir directamente a OutputStream. O, si se necesita una forma intermedia por alguna razón, puede usar byte[]. La mayoría de las bibliotecas JSON de Java pueden escribir directamente en OutputStream.
StaxMan
7

Dependiendo de la versión de Java (o JDK, SDK, JRE ... no sé, soy nuevo en el ecosistema de Java), JsonObjectes abstracto. Entonces, esta es una nueva implementación:

import javax.json.Json;
import javax.json.JsonObject;

...

try (PrintWriter out = response.getWriter()) {
    response.setContentType("application/json");       
    response.setCharacterEncoding("UTF-8");

    JsonObject json = Json.createObjectBuilder().add("foo", "bar").build();

    out.print(json.toString());
}
Rafael Barros
fuente
3

response.setContentType ("texto / json");

// crea la cadena JSON, sugiero usar un marco.

Cadena your_string;

out.write (your_string.getBytes ("UTF-8"));

RHT
fuente
¿Necesito usar getBytes ("UTF-8")) o puedo devolver la variable String?
Ankur
Es una práctica de programación segura usar UTF-8 para codificar la respuesta de una aplicación web.
RHT
0

Cerca de la respuesta de BalusC en 4 líneas simples usando Google Gson lib. Agregue estas líneas al método de servlet:

User objToSerialize = new User("Bill", "Gates");    
ServletOutputStream outputStream = response.getOutputStream();

response.setContentType("application/json;charset=UTF-8");
outputStream.print(new Gson().toJson(objToSerialize));

¡Buena suerte!

Panayot Kulchev
fuente
0

Al usar Gson puede enviar una respuesta json, vea el código a continuación

Puedes ver este código

@WebServlet(urlPatterns = {"/jsonResponse"})
public class JsonResponse extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("application/json");
    response.setCharacterEncoding("utf-8");
    Student student = new Student(12, "Ram Kumar", "Male", "1234565678");
    Subject subject1 = new Subject(1, "Computer Fundamentals");
    Subject subject2 = new Subject(2, "Computer Graphics");
    Subject subject3 = new Subject(3, "Data Structures");
    Set subjects = new HashSet();
    subjects.add(subject1);
    subjects.add(subject2);
    subjects.add(subject3);
    student.setSubjects(subjects);
    Address address = new Address(1, "Street 23 NN West ", "Bhilai", "Chhattisgarh", "India");
    student.setAddress(address);
    Gson gson = new Gson();
    String jsonData = gson.toJson(student);
    PrintWriter out = response.getWriter();
    try {
        out.println(jsonData);
    } finally {
        out.close();
    }

  }
}

útil de respuesta json de servlet en java

xrcwrn
fuente
0

Puedes usar abajo como.

Si quieres usar json array:

  1. descargar json-simple-1.1.1.jar y agréguelo a su ruta de clase de proyecto
  2. Crear una clase llamada Modelo como abajo

    public class Model {
    
     private String id = "";
     private String name = "";
    
     //getter sertter here
    }
  3. En sevlet getMethod puedes usar como abajo

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    
      //begin get data from databse or other source
      List<Model> list = new ArrayList<>();
      Model model = new Model();
      model.setId("101");
      model.setName("Enamul Haque");
      list.add(model);
    
      Model model1 = new Model();
      model1.setId("102");
      model1.setName("Md Mohsin");
      list.add(model1);
      //End get data from databse or other source
    try {
    
        JSONArray ja = new JSONArray();
        for (Model m : list) {
            JSONObject jSONObject = new JSONObject();
            jSONObject.put("id", m.getId());
            jSONObject.put("name", m.getName());
            ja.add(jSONObject);
        }
        System.out.println(" json ja = " + ja);
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().print(ja.toString());
        response.getWriter().flush();
       } catch (Exception e) {
         e.printStackTrace();
      }
    
     }
  4. Salida :

        [{"name":"Enamul Haque","id":"101"},{"name":"Md Mohsin","id":"102"}]

Quiero json Object solo use como:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    try {

        JSONObject json = new JSONObject();
        json.put("id", "108");
        json.put("name", "Enamul Haque");
        System.out.println(" json JSONObject= " + json);
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().print(json.toString());
        response.getWriter().flush();
        // System.out.println("Response Completed... ");
    } catch (Exception e) {
        e.printStackTrace();
    }

}

Función anterior Salida :

{"name":"Enamul Haque","id":"108"}

La fuente completa se proporciona a GitHub: https://github.com/enamul95/ServeletJson.git

Enamul Haque
fuente