Bagaimana Anda mengembalikan objek JSON dari Java Servlet

153

Bagaimana Anda mengembalikan objek JSON dari servlet Java.

Sebelumnya ketika melakukan AJAX dengan servlet saya telah mengembalikan sebuah string. Apakah ada tipe objek JSON yang perlu digunakan, atau Anda hanya mengembalikan sebuah String yang terlihat seperti objek JSON misalnya

String objectToReturn = "{ key1: 'value1', key2: 'value2' }";
Ankur
sumber
10
Nitpick; tidakkah Anda ingin lebih suka { key1: value1, key2: value2 }?
14
Nitpick: yang benar-benar dia inginkan adalah {"key1": "value1", "key2": "value2"} ... :-)
PhiLho
@Ankur memeriksa tautan jika Anda memutuskan untuk menggunakan Spring 3.2.0.
AmirHd
5
Nitpick: kita seharusnya tidak menganggap bahwa nilainya adalah Strings, jadi yang dia inginkan adalah {"key1": value1, "key2": value2}
NoBrainer
Nitpicks ini (khususnya dalam urutan ini), sangat epik :)
Ankur

Jawaban:

57

Saya melakukan persis apa yang Anda sarankan (return a String).

Anda mungkin mempertimbangkan untuk menetapkan tipe MIME untuk menunjukkan Anda kembali JSON, (menurut posting stackoverflow ini adalah "application / json").

Mark Elliot
sumber
175

Tulis objek JSON ke aliran output objek respons.

Anda juga harus mengatur jenis konten sebagai berikut, yang akan menentukan apa yang Anda kembalikan:

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();
pengguna241924
sumber
7
Ini membantu saya. Seperti disebutkan dalam jawaban Mark Elliot, jsonObject dapat berupa string yang diformat sebagai json. Ingatlah untuk menggunakan tanda kutip ganda, karena tanda kutip tunggal tidak akan memberi Anda json yang valid. Mis .:String jsonStr = "{\"my_key\": \"my_value\"}";
marcelocra
3
Akan lebih baik menggunakan response.setCharacterEncoding ("utf-8"); juga
erhun
81

Konversi objek JSON terlebih dahulu menjadi String. Kemudian cukup tuliskan ke penulis respons bersama dengan tipe konten application/jsondan pengkodean karakter UTF-8.

Berikut ini sebuah contoh dengan asumsi Anda menggunakan Google Gson untuk mengonversi objek Java ke 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);
}

Itu saja.

Lihat juga:

BalusC
sumber
Saya melakukan ini untuk mengirim respons ke javascript dan menampilkan respons dalam lansiran. mengapa ini menampilkan kode html di dalam peringatan .. mengapa saya mendapatkan kode html sebagai tanggapan. saya melakukan hal yang sama persis seperti yang Anda katakan.
Abhi
Saya memiliki masalah yang sama dengan @iLive
Wax
30

Bagaimana Anda mengembalikan objek JSON dari 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
sumber
Tergantung pada versinya, JsonObject bersifat abstrak. Saya membuat jawaban untuk implementasi yang lebih baru.
Rafael Barros
8

Cukup tulis string ke aliran output. Anda dapat mengatur tipe MIME ke text/javascript( edit : application/jsontampaknya resmi) jika Anda merasa membantu. (Ada kemungkinan kecil tapi bukan nol bahwa itu akan menjaga sesuatu dari mengacaukannya suatu hari nanti, dan itu adalah praktik yang baik.)


sumber
8

Gson sangat berguna untuk ini. bahkan lebih mudah. ini contoh saya:

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

Harus mengatakan orang jika vars Anda kosong ketika menggunakan gson itu tidak akan membangun json untuk Anda

{}

pengguna super
sumber
8

Saya menggunakan Jackson untuk mengonversi Java Object ke string JSON dan mengirim sebagai berikut.

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

Mungkin ada objek JSON untuk kenyamanan pengkodean Java. Tetapi pada akhirnya struktur data akan diserialisasi ke string. Mengatur tipe MIME yang tepat akan menyenangkan.

Saya sarankan JSON Java dari json.org .

nol
sumber
Salah. Biasanya tidak ada alasan untuk menambahkan overhead membangun String- output harus langsung menuju OutputStream. Atau, jika bentuk peralihan diperlukan karena alasan tertentu, dapat digunakan byte[]. Sebagian besar pustaka JSON Java dapat menulis langsung ke OutputStream.
StaxMan
7

Bergantung pada versi Java (atau JDK, SDK, JRE ... saya tidak tahu, saya baru di ekosistem Java), JsonObjectini abstrak. Jadi, ini adalah implementasi baru:

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

response.setContentType ("text / json");

// buat string JSON, saya sarankan menggunakan beberapa framework.

String your_string;

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

RHT
sumber
apakah saya perlu menggunakan getBytes ("UTF-8")) atau dapatkah saya mengembalikan variabel String?
Ankur
Ini adalah praktik pemrograman yang aman untuk menggunakan UTF-8 untuk menyandikan respons aplikasi web.
RHT
0

Tutup jawaban BalusC dalam 4 baris sederhana menggunakan Google Gson lib. Tambahkan baris ini ke metode servlet:

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

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

Semoga berhasil!

Panayot Kulchev
sumber
0

Dengan Menggunakan Gson Anda dapat mengirim respons json, lihat kode di bawah ini

Anda dapat melihat kode ini

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

  }
}

membantu dari respons json dari servlet di java

xrcwrn
sumber
0

Anda dapat menggunakan seperti di bawah ini.

Jika Anda ingin menggunakan json array:

  1. unduh json-simple-1.1.1.jar & tambahkan ke jalur kelas proyek Anda
  2. Buat kelas bernama Model seperti di bawah ini

    public class Model {
    
     private String id = "";
     private String name = "";
    
     //getter sertter here
    }
  3. Dalam sevlet getMethod Anda dapat menggunakan seperti di bawah ini

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

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

Saya ingin json Object hanya menggunakan seperti:

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

}

Output fungsi di atas :

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

Sumber lengkap diberikan kepada GitHub: https://github.com/enamul95/ServeletJson.git

Enamul Haque
sumber