Java 서블릿에서 JSON 객체를 반환하는 방법


153

Java 서블릿에서 JSON 객체를 어떻게 반환합니까?

이전에는 서블릿으로 AJAX를 수행 할 때 문자열을 반환했습니다. 사용해야하는 JSON 객체 유형이 있습니까, 아니면 JSON 객체처럼 보이는 문자열을 반환합니까?

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

10
니트 픽; 더 좋아하고 싶지 않아 { key1: value1, key2: value2 }?

14
Nitpick : 그가 정말로 원하는 것은 { "key1": "value1", "key2": "value2"} ... :-)
PhiLho

Spring 3.2.0을 사용하기로 결정했다면 @Ankur가 링크를 체크 아웃하십시오 .
AmirHd

5
Nitpick : 값이 문자열이라고 가정해서는 안되므로 그가 원하는 것은 { "key1": value1, "key2": value2}
NoBrainer

이 Nitpicks (이 순서대로)는 서사시입니다 :)
Ankur

답변:


57

나는 당신이 제안한 것을 정확하게 수행합니다 ( String).

그래도 JSON을 반환한다는 것을 나타내도록 MIME 유형을 설정하는 것을 고려할 수 있습니다 ( 이 다른 stackoverflow 게시물 에 따르면 "application / json"임).


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");을 사용하는 것이 좋습니다. 너무
erhun

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

Java 서블릿에서 JSON 객체를 반환하는 방법

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분명히 공식적)으로 설정할 수 있습니다 . (언제나 언젠가는 엉망이 될 가능성이 있으며 좋은 방법입니다.)


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": "juan", "apellido": "machado", "datosCriticos": [{ "edad": 12}]}

gson을 사용할 때 var가 비어 있으면 사람들을 위해 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

Java 코딩 편의를 위해 JSON 오브젝트가있을 수 있습니다. 그러나 마침내 데이터 구조는 문자열로 직렬화됩니다. 적절한 MIME 유형을 설정하는 것이 좋습니다.

나는 좋을 것 JSON 자바 에서 json.org .


잘못되었습니다. 일반적으로 String출력 을 생성하는 오버 헤드를 추가 할 이유는 없습니다 OutputStream. 또는 어떤 이유로 중간 형식이 필요한 경우을 사용할 수 있습니다 byte[]. 대부분의 Java JSON 라이브러리는에 직접 쓸 수 있습니다 OutputStream.
StaxMan

7

Java 버전 (또는 JDK, SDK, JRE ... i dunno, 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

Google Gson lib를 사용하여 BalusC와 가까운 간단한 4 줄로 답변합니다. 이 행을 서블릿 메소드에 추가하십시오.

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

  }
}

Java에서 서블릿의 json 응답에서 도움이되었습니다.


0

다음과 같이 사용할 수 있습니다.

json 배열을 사용하려면 다음을 수행하십시오.

  1. json-simple-1.1.1.jar를 다운로드하고 프로젝트 클래스 경로에 추가하십시오.
  2. 다음 과 같은 Model 이라는 클래스를 만듭니다.

    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.