Come si restituisce un oggetto JSON da un servlet Java


153

Come si restituisce un oggetto JSON da un servlet Java.

Precedentemente quando facevo AJAX con un servlet ho restituito una stringa. Esiste un tipo di oggetto JSON che deve essere utilizzato o restituisci semplicemente una stringa che assomiglia ad un oggetto JSON ad es

String objectToReturn = "{ key1: 'value1', key2: 'value2' }";

10
nitpick; non dovresti volere di più { key1: value1, key2: value2 }?

14
Nitpick: quello che vuole davvero è {"key1": "value1", "key2": "value2"} ... :-)
PhiLho,

@Ankur controlla il link se hai deciso di utilizzare Spring 3.2.0.
AmirHd,

5
Nitpick: non dovremmo supporre che i valori siano String, quindi quello che vuole davvero è {"key1": value1, "key2": value2}
NoBrainer

Questi Nitpicks (specialmente in questo ordine) sono epici :)
Ankur,

Risposte:


57

Faccio esattamente quello che suggeriscono (ritorno a String).

Tuttavia, potresti considerare di impostare il tipo MIME per indicare che stai restituendo JSON (secondo questo post dello stackoverflow è "application / json").


175

Scrivi l'oggetto JSON nel flusso di output dell'oggetto di risposta.

Dovresti anche impostare il tipo di contenuto come segue, che specificherà cosa stai restituendo:

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

7
Questo mi ha aiutato. Come menzionato nella risposta di Mark Elliot, jsonObject potrebbe essere solo una stringa formattata come json. Ricorda di usare le virgolette doppie, poiché le virgolette singole non ti daranno un json valido. Es .:String jsonStr = "{\"my_key\": \"my_value\"}";
marcelocra,

3
Sarà utile usare response.setCharacterEncoding ("utf-8"); troppo
erhun

81

Per prima cosa converti l'oggetto JSON in String. Quindi scrivilo allo scrittore di risposta insieme al tipo di contenuto application/jsone alla codifica dei caratteri di UTF-8.

Ecco un esempio supponendo che tu stia utilizzando Google Gson per convertire un oggetto Java in una stringa 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);
}

È tutto.

Guarda anche:


Lo sto facendo per inviare una risposta a JavaScript e visualizzare la risposta in allerta. perché visualizza il codice HTML all'interno dell'avviso ... perché sto ricevendo il codice HTML come risposta. ho fatto esattamente la stessa cosa che hai detto.
Abhi

Ho lo stesso problema di @iLive
Wax

30

Come si restituisce un oggetto JSON da 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());

A seconda della versione, JsonObject è astratto. Ho creato una risposta a un'implementazione più recente.
Rafael Barros,

8

Basta scrivere una stringa nel flusso di output. Puoi impostare il tipo MIME su text/javascript( modifica : application/jsonè apparentemente ufficiale) se ti senti utile. (C'è una piccola ma diversa possibilità che un giorno impedirà a qualcosa di rovinarlo, ed è una buona pratica.)


8

Gson è molto utile per questo. anche più facile. ecco il mio esempio:

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

Devo dire alla gente se i tuoi var sono vuoti quando usi gson non costruirà il json per te

{}


8

Ho usato Jackson per convertire oggetti Java in string JSON e inviarli come segue.

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

7

Potrebbe esserci un oggetto JSON per comodità di codifica Java. Ma alla fine la struttura dei dati sarà serializzata su stringa. L'impostazione di un tipo MIME corretto sarebbe utile.

Suggerirei JSON Java da json.org .


Non corretto. Di solito non c'è motivo di aggiungere un sovraccarico per la costruzione di un String- output dovrebbe andare dritto a OutputStream. Oppure, se per qualche motivo è necessaria una forma intermedia, è possibile utilizzare byte[]. La maggior parte delle librerie JSON Java può scrivere direttamente su OutputStream.
StaxMan

7

A seconda della versione di Java (o JDK, SDK, JRE ... non so, sono nuovo nell'ecosistema Java), JsonObjectè astratto. Quindi, questa è una nuova implementazione:

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

3

response.setContentType ( "text / json");

// crea la stringa JSON, suggerisco di usare un framework.

String your_string;

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


devo usare getBytes ("UTF-8")) o posso semplicemente restituire la variabile String?
Ankur,

È una pratica di programmazione sicura usare UTF-8 per codificare la risposta di un'applicazione web.
RHT,

0

Vicino a BalusC rispondi in 4 semplici righe usando la lib di Google Gson. Aggiungi questa riga al metodo servlet:

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

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

In bocca al lupo!


0

Utilizzando Gson è possibile inviare una risposta json, vedere il codice seguente

Puoi vedere questo codice

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

  }
}

utile dalla risposta json da servlet in java


0

Puoi usare muggito come.

Se si desidera utilizzare json array:

  1. scaricare json-simple-1.1.1.jar e aggiungerlo al percorso della classe del progetto
  2. Crea una classe di nome Modello come muggito

    public class Model {
    
     private String id = "";
     private String name = "";
    
     //getter sertter here
    }
  3. In sevlet getMethod puoi usare come muggito

    @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. Uscita :

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

Voglio che json Object usi come:

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

}

Sopra la funzione di uscita :

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

La fonte completa è data a GitHub: https://github.com/enamul95/ServeletJson.git

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.