คุณส่งคืนอ็อบเจ็กต์ JSON จาก Java Servlet อย่างไร


153

คุณส่งคืนอ็อบเจ็กต์ JSON ในรูปแบบ servlet Java ได้อย่างไร

ก่อนหน้านี้เมื่อทำ AJAX กับ servlet ฉันได้คืนสตริง มีประเภทของวัตถุ JSON ที่ต้องใช้หรือไม่หรือคุณเพียงแค่คืนค่าสตริงที่ดูเหมือนว่าวัตถุ JSON เช่น

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

10
nitpick; คุณไม่ควรต้องการอะไรอีก{ key1: value1, key2: value2 }หรือ

14
Nitpick: สิ่งที่เขาต้องการจริงๆคือ {"key1": "value1", "key2": "value2"} ... :-)
PhiLho

@Ankur เช็คเอาท์ลิงค์ถ้าคุณตัดสินใจที่จะใช้ Spring 3.2.0
AmirHd

5
Nitpick: เราไม่ควรถือว่าค่าเป็นสตริงดังนั้นสิ่งที่เขาต้องการจริงๆคือ {"key1": value1, "key2": value2}
NoBrainer

Nitpicks เหล่านี้ (โดยเฉพาะอย่างยิ่งตามลำดับนี้) เป็นมหากาพย์ :)
Ankur

คำตอบ:



175

เขียนอ็อบเจ็กต์ JSON ไปยังเอาต์พุตสตรีมการตอบกลับของอ็อบเจ็กต์

คุณควรตั้งค่าประเภทเนื้อหาดังต่อไปนี้ซึ่งจะระบุสิ่งที่คุณจะกลับมา:

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
สิ่งนี้ช่วยฉัน ตามที่กล่าวไว้ในคำตอบของ Mark Elliot, jsonObjectอาจเป็นเพียงรูปแบบของสตริงที่เป็น json อย่าลืมใช้เครื่องหมายคำพูดคู่เนื่องจากคำพูดเดี่ยวจะไม่ให้ json ที่ถูกต้อง เช่น.String jsonStr = "{\"my_key\": \"my_value\"}";
marcelocra

3
มันจะเป็นการดีที่จะใช้ response.setCharacterEncoding ("utf-8"); เหมือนกัน
เอ๋อหลุน

81

แปลงแรกวัตถุ JSON Stringเพื่อ จากนั้นเพียงเขียนออกไปยังผู้เขียนคำตอบพร้อมกับประเภทเนื้อหาapplication/jsonและการเข้ารหัสอักขระของ UTF-8

นี่คือตัวอย่างสมมติว่าคุณกำลังใช้Google Gsonเพื่อแปลงวัตถุ Java เป็นสตริง 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);
}

นั่นคือทั้งหมดที่

ดูสิ่งนี้ด้วย:


ฉันกำลังทำสิ่งนี้เพื่อส่งการตอบกลับไปยังจาวาสคริปต์และแสดงการตอบกลับในการแจ้งเตือน ทำไมมันแสดงรหัส html ภายในการแจ้งเตือน .. ทำไมฉันได้รับรหัส html เป็นการตอบสนอง ฉันทำสิ่งเดียวกันกับที่คุณพูด
Abhi

ฉันมีปัญหาเช่นเดียวกับ @iLive
Wax

30

คุณส่งคืนอ็อบเจ็กต์ JSON จาก 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());

JsonObject เป็นนามธรรมขึ้นอยู่กับรุ่น ฉันสร้างคำตอบสำหรับการนำไปใช้ที่ใหม่กว่า
Rafael Barros

8

เพียงเขียนสตริงลงในเอาต์พุตสตรีม คุณอาจตั้งค่า MIME-ชนิดtext/javascript( แก้ไข : application/jsonเห็นได้ชัดคือ officialer) ถ้าคุณรู้สึกที่เป็นประโยชน์ (มีโอกาสเล็กน้อย แต่ไม่ใช่ศูนย์ที่จะทำให้บางสิ่งบางอย่างยุ่งเหยิงสักวันหนึ่งและเป็นการฝึกฝนที่ดี)


8

Gson มีประโยชน์มากสำหรับเรื่องนี้ ง่ายยิ่งขึ้น นี่คือตัวอย่างของฉัน:

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": "ฆ", "Apellido": "Machado", "datosCriticos": [{ "edad": 12}]}

ต้องบอกว่าคนถ้า vars ของคุณว่างเปล่าเมื่อใช้ gson มันจะไม่สร้าง json ให้คุณเพียงแค่

{}


8

ฉันใช้Jacksonเพื่อแปลง Java Object เป็นสตริง JSON และส่งดังนี้

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

อาจมีวัตถุ JSON เพื่อความสะดวกในการเขียนโค้ด Java แต่ในที่สุดโครงสร้างข้อมูลจะถูกทำให้เป็นสตริง การตั้งค่าประเภท MIME ที่เหมาะสมจะดี

ผมขอแนะนำให้JSON Javaจากjson.org


ไม่ถูกต้อง โดยปกติจะมีเหตุผลที่จะเพิ่มค่าใช้จ่ายในการสร้างไม่มีString- OutputStreamส่งออกควรตรงไปที่ หรือถ้าจำเป็นต้องใช้แบบฟอร์มกลางด้วยเหตุผลบางอย่างสามารถbyte[]ใช้ได้ ส่วนใหญ่ห้องสมุด Java JSON OutputStreamสามารถเขียนโดยตรงกับ
StaxMan

7

ทั้งนี้ขึ้นอยู่กับรุ่น Java (หรือ JDK, SDK, JRE ... ฉันไม่ได้, ฉันใหม่กับระบบนิเวศ Java), JsonObjectเป็นนามธรรม ดังนั้นนี่คือการใช้งานใหม่:

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

// สร้างสตริง JSON ฉันขอแนะนำให้ใช้เฟรมเวิร์ก

สตริง your_string;

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


ฉันจะต้องใช้ getBytes ("UTF-8")) หรือฉันจะส่งคืนตัวแปร String ได้หรือไม่
Ankur

เป็นการฝึกเขียนโปรแกรมอย่างปลอดภัยในการใช้ UTF-8 เพื่อเข้ารหัสการตอบสนองของโปรแกรมประยุกต์บนเว็บ
RHT

0

ใกล้กับคำตอบBalusCใน 4 บรรทัดง่าย ๆ โดยใช้ Google Gson lib เพิ่มบรรทัดนี้ไปยังวิธี servlet:

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

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

โชคดี!


0

โดยใช้ Gson คุณสามารถส่งคำตอบ json ดูรหัสด้านล่าง

คุณสามารถดูรหัสนี้

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

  }
}

ประโยชน์จากการตอบสนอง json จาก servlet ใน java


0

คุณอาจใช้ร้องเหมือน

หากคุณต้องการใช้อาร์เรย์ json:

  1. ดาวน์โหลด json-simple-1.1.1.jar & เพิ่มในพา ธ คลาสโปรเจ็กต์ของคุณ
  2. สร้างคลาสที่ชื่อว่าModel like bellow

    public class Model {
    
     private String id = "";
     private String name = "";
    
     //getter sertter here
    }
  3. ใน sevlet getMethod คุณสามารถใช้เหมือนร้อง

    @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. ผลผลิต :

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

ฉันต้องการ json Object เพียงใช้เช่น:

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

}

ฟังก์ชั่นด้านบนเอาท์พุท :

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

แหล่งข้อมูลเต็มรูปแบบมอบให้กับ GitHub: https://github.com/enamul95/ServeletJson.git

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.