Làm thế nào để bạn trả về một đối tượng JSON từ một Servlet Java


153

Làm thế nào để bạn trả về một đối tượng JSON tạo thành một servlet Java.

Trước đây khi thực hiện AJAX với một servlet tôi đã trả về một chuỗi. Có loại đối tượng JSON nào cần được sử dụng không, hoặc bạn chỉ trả về một Chuỗi trông giống như một đối tượng JSON, vd

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

10
Xoi mói; bạn có muốn nhiều hơn { key1: value1, key2: value2 }không?

14
Nitpick: thứ anh ấy thực sự muốn là {"key1": "value1", "key2": "value2"} ... :-)
PhiLho

@Ankur kiểm tra liên kết nếu bạn quyết định sử dụng Spring 3.2.0.
AmirHd

5
Nitpick: chúng ta không nên giả sử các giá trị là String, vì vậy thứ anh ấy thực sự muốn là {"key1": value1, "key2": value2}
NoBrainer

Những Nitpicks này (đặc biệt theo thứ tự này), thật tuyệt vời :)
Ankur

Câu trả lời:



175

Viết đối tượng JSON vào luồng đầu ra của đối tượng phản hồi.

Bạn cũng nên đặt loại nội dung như sau, nó sẽ chỉ định những gì bạn sẽ trả về:

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
Điều này đã giúp tôi. Như đã đề cập trong câu trả lời của Mark Elliot, jsonObject có thể chỉ là một chuỗi được định dạng là json. Hãy nhớ sử dụng dấu ngoặc kép, vì dấu ngoặc đơn sẽ không cung cấp cho bạn một giá trị hợp lệ. Vd:String jsonStr = "{\"my_key\": \"my_value\"}";
marcelocra

3
Sẽ rất tốt khi sử dụng answer.setCharacterEncoding ("utf-8"); quá
erhun

81

Đầu tiên chuyển đổi đối tượng JSON thành String. Sau đó, chỉ cần viết nó ra cho người viết phản hồi cùng với kiểu nội dung application/jsonvà mã hóa ký tự của UTF-8.

Dưới đây là một ví dụ giả sử bạn đang sử dụng Google Gson để chuyển đổi một đối tượng Java thành chuỗi 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);
}

Đó là tất cả.

Xem thêm:


Tôi đang làm điều này để gửi phản hồi tới javascript và hiển thị phản hồi trong cảnh báo. tại sao nó lại hiển thị mã html bên trong cảnh báo..tại sao tôi lại nhận được mã html dưới dạng phản hồi. tôi đã làm chính xác như bạn nói.
Abhi

Tôi có cùng một vấn đề với @iLive
Wax

30

Làm thế nào để bạn trả về một đối tượng JSON từ một 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());

Tùy thuộc vào phiên bản, JsonObject là trừu tượng. Tôi đã tạo ra một câu trả lời cho một triển khai mới hơn.
Rafael Barros

8

Chỉ cần viết một chuỗi vào luồng đầu ra. Bạn có thể đặt loại MIME thành text/javascript( chỉnh sửa : application/jsonrõ ràng là chính thức) nếu bạn cảm thấy hữu ích. (Có một cơ hội nhỏ nhưng khác thường là nó sẽ giữ thứ gì đó không làm hỏng nó vào một ngày nào đó, và đó là một thực hành tốt.)


8

Gson rất hữu ích cho việc này. thậm chí dễ dàng hơn. đây là ví dụ của tôi:

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

Phải nói với mọi người nếu bình của bạn trống khi sử dụng gson, nó sẽ không tạo ra json cho bạn. Chỉ cần

{}


8

Tôi đã sử dụng Jackson để chuyển đổi đối tượng Java thành chuỗi JSON và gửi như sau.

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

Có thể có một đối tượng JSON để thuận tiện cho việc mã hóa Java. Nhưng cuối cùng, cấu trúc dữ liệu sẽ được nối tiếp thành chuỗi. Đặt loại MIME thích hợp sẽ rất tốt.

Tôi muốn đề xuất JSON Java từ json.org .


Sai. Thường không có lý do để thêm chi phí xây dựng một String- đầu ra nên đi thẳng vào OutputStream. Hoặc, nếu hình thức trung gian là cần thiết cho một số lý do, có thể sử dụng byte[]. Hầu hết các thư viện Java JSON có thể viết trực tiếp vào OutputStream.
Staxman

7

Tùy thuộc vào phiên bản Java (hoặc JDK, SDK, JRE ... i dunno, tôi mới sử dụng hệ sinh thái Java), đây JsonObjectlà bản tóm tắt. Vì vậy, đây là một triển khai mới:

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

answer.setContentType ("text / json");

// tạo chuỗi JSON, tôi đề nghị sử dụng một số khung công tác.

Chuỗi your_ chuỗi;

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


Tôi có cần sử dụng getBytes ("UTF-8")) hay tôi chỉ có thể trả về biến String?
Ankur

Đó là cách thực hành lập trình an toàn để sử dụng UTF-8 để mã hóa phản hồi của ứng dụng web.
RHT

0

Đóng câu trả lời của BalusC trong 4 dòng đơn giản bằng Google Gson lib. Thêm dòng này vào phương thức servlet:

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

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

Chúc may mắn!


0

Bằng cách sử dụng Gson, bạn có thể gửi phản hồi json xem mã bên dưới

Bạn có thể thấy mã này

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

  }
}

hữu ích từ phản hồi json từ servlet trong java


0

Bạn có thể sử dụng dưới đây như.

Nếu bạn muốn sử dụng mảng json:

  1. tải về json-simple-1.1.1.jar và thêm vào đường dẫn lớp dự án của bạn
  2. Tạo một lớp có tên Model như dưới đây

    public class Model {
    
     private String id = "";
     private String name = "";
    
     //getter sertter here
    }
  3. Trong Sevlet getMethod, bạn có thể sử dụng như dưới đây

    @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. Đầu ra :

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

Tôi muốn json Object chỉ cần sử dụng như:

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

}

Chức năng trên Đầu ra :

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

Nguồn đầy đủ được cung cấp cho GitHub: https://github.com/enamul95/ServeletJson.git

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.