Як повернути об’єкт JSON з сервлету Java


153

Як повернути об'єкт JSON із сервлета Java.

Раніше під час виконання AJAX з сервлетом я повернув рядок. Чи є тип об'єкта JSON, який потрібно використовувати, чи ви просто повертаєте рядок, схожий на об'єкт JSON, наприклад

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

10
Нітпік; ти не хочеш більше подібного { key1: value1, key2: value2 }?

14
Нітпік: те, що він насправді хоче, це {"key1": "value1", "key2": "value2"} ... :-)
PhiLho

@Ankur замовіть посилання, якщо ви вирішили використовувати Spring 3.2.0.
AmirHd

5
Нітпік: ми не повинні вважати, що значення - це рядки, тому те, що він насправді хоче, це {"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
Це мені допомогло. Як згадується у відповіді Марка Еліота, 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);
}

Це все.

Дивитися також:


Я роблю це, щоб надсилати відповідь на javascript та відображати відповідь у сповіщенні. Чому він відображає HTML-код всередині попередження ... Чому я отримую HTML-код як відповідь. я зробив точно так само, як ти сказав.
Абхі

У мене те саме питання, що і @iLive
воск

30

Як повернути об’єкт JSON з сервлету 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());

Залежно від версії, JsonObject є абстрактним. Я створив відповідь на новішу реалізацію.
Рафаель Баррос

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, він не збирається створити json для вас. Просто

{}


8

Я використовував Джексона для перетворення об’єкта Java в рядок 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 Java від json.org .


Неправильно. Зазвичай немає підстав додавати накладні витрати на побудову a String- результат повинен йти прямо OutputStream. Або, якщо з якоїсь причини потрібна проміжна форма, можна використовувати byte[]. Більшість бібліотек Java JSON можуть записувати безпосередньо в OutputStream.
StaxMan

7

Залежно від версії Java (або JDK, SDK, JRE ... i dunno, im new to the ecosystem 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 ("текст / json");

// Створіть рядок JSON, я пропоную використовувати якийсь фреймворк.

Рядок yourringring;

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


чи потрібно використовувати getBytes ("UTF-8")) чи можу я просто повернути змінну String?
Анкур

Використовувати UTF-8 для кодування відповіді веб-програми - безпечна практика програмування.
RHT

0

Близько до відповіді BalusC в 4 простих рядках, використовуючи lib Google Gson. Додайте ці рядки до методу сервлетів:

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 від сервлета в Java


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.