Como você retorna um objeto JSON de um Java Servlet

153

Como você retorna um objeto JSON de um servlet Java.

Anteriormente, ao fazer o AJAX com um servlet, retornei uma string. Existe um tipo de objeto JSON que precisa ser usado ou você simplesmente retorna uma String que se parece com um objeto JSON, por exemplo

String objectToReturn = "{ key1: 'value1', key2: 'value2' }";
Ankur
fonte
10
Nitpick; você não deveria querer mais { key1: value1, key2: value2 }?
14
Nitpick: o que ele realmente quer é { "key1": "value1", "key2": "value2"} ... :-)
PhiLho
@Ankur verifique o link se você decidiu usar o Spring 3.2.0.
AmirHd
5
Nitpick: não devemos assumir os valores são strings, então o que ele realmente quer é { "key1": value1 "key2": value2}
NoBrainer
Estes nitpicks (. Esp nesta ordem), são épicas :)
Ankur

Respostas:

57

Eu faço exatamente o que você sugere (retorne a String).

Você pode considerar configurar o tipo MIME para indicar que você está retornando JSON (embora de acordo com essa outra postagem sobre stackoverflow , seja "application / json").

Mark Elliot
fonte
175

Escreva o objeto JSON no fluxo de saída do objeto de resposta.

Você também deve definir o tipo de conteúdo da seguinte forma, que especificará o que você está retornando:

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
fonte
7
Isso me ajudou. Como mencionado na resposta de Mark Elliot, jsonObject pode ser apenas uma string formatada como json. Lembre-se de usar aspas duplas, pois aspas simples não fornecerão um json válido. Ex .:String jsonStr = "{\"my_key\": \"my_value\"}";
marcelocra 23/02
3
Será bom usar response.setCharacterEncoding ("utf-8"); também
erhun
81

Primeiro converta o objeto JSON para String. Em seguida, basta escrevê-lo no gravador de respostas, juntamente com o tipo de conteúdo application/jsone a codificação de caracteres do UTF-8.

Aqui está um exemplo, supondo que você esteja usando o Google Gson para converter um objeto Java em uma string 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);
}

Isso é tudo.

Veja também:

BalusC
fonte
Estou fazendo isso para enviar resposta ao javascript e exibindo a resposta em alerta. por que ele está exibindo o código html dentro do alerta .. por que estou recebendo o código html como resposta. Eu fiz exatamente a mesma coisa que você disse.
Abhi
Tenho o mesmo problema que @iLive
Wax
30

Como você retorna um objeto JSON de um Java Servlet

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
fonte
Dependendo da versão, o JsonObject é abstrato. Eu criei uma resposta para uma implementação mais recente.
Rafael Barros
8

Basta escrever uma string no fluxo de saída. Você pode definir o tipo MIME como text/javascript( editar : application/jsonaparentemente é oficial) se estiver se sentindo útil. (Há uma chance pequena, mas diferente de zero, de impedir que algo atrapalhe um dia, e é uma boa prática.)


fonte
8

Gson é muito útil para isso. mais fácil mesmo. aqui está o meu exemplo:

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

Tenho que dizer às pessoas se seus vars estão vazios ao usar o gson, ele não criará o json para você.

{}

superusuário
fonte
8

Usei Jackson para converter Java Object em JSON e enviar da seguinte maneira.

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

Pode haver um objeto JSON para conveniência de codificação Java. Mas, finalmente, a estrutura de dados será serializada em string. Definir um tipo MIME adequado seria bom.

Eu sugiro JSON Java do json.org .

nada
fonte
Incorreta. Normalmente, não há razão para adicionar sobrecarga na construção de uma Stringsaída - deve ir diretamente para OutputStream. Ou, se a forma intermediária for necessária por algum motivo, pode ser usada byte[]. A maioria das bibliotecas Java JSON pode gravar diretamente OutputStream.
StaxMan
7

Dependendo da versão do Java (ou JDK, SDK, JRE ... não sei, sou novo no ecossistema Java), o JsonObjectresumo é abstrato. Portanto, esta é uma nova implementação:

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
fonte
3

response.setContentType ("text / json");

// cria a string JSON, sugiro usar alguma estrutura.

String your_string;

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

RHT
fonte
preciso usar getBytes ("UTF-8")) ou posso apenas retornar a variável String?
Ankur
É uma prática de programação segura usar o UTF-8 para codificar a resposta de um aplicativo da web.
RHT
0

Perto da resposta BalusC em 4 linhas simples, usando o Google Gson lib. Inclua estas linhas no método do servlet:

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

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

Boa sorte!

Panayot Kulchev
fonte
0

Usando o Gson, você pode enviar a resposta do json, veja o código abaixo

Você pode 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 da resposta json do servlet em java

xrcwrn
fonte
0

Você pode usar abaixo como.

Se você deseja usar o json array:

  1. Faça o download do json-simple-1.1.1.jar e inclua no caminho da classe do projeto
  2. Crie uma classe chamada Model como abaixo

    public class Model {
    
     private String id = "";
     private String name = "";
    
     //getter sertter here
    }
  3. No getMethod de sevlet você pode usar como abaixo

    @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. Saída :

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

Eu quero json Object basta usar 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();
    }

}

Acima da função Saída :

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

A fonte completa é fornecida ao GitHub: https://github.com/enamul95/ServeletJson.git

Enamul Haque
fonte