Как вы возвращаете объект JSON из сервлета Java

153

Как вы возвращаете объект JSON из сервлета Java?

Ранее при выполнении AJAX с сервлетом я возвращал строку. Есть ли тип объекта JSON, который нужно использовать, или вы просто возвращаете строку, которая выглядит как объект JSON, например

String objectToReturn = "{ key1: 'value1', key2: 'value2' }";
Анкур
источник
10
придираться; разве ты не хочешь больше как { 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

Ответы:

57

Я делаю именно то, что вы предлагаете (вернуть String).

Вы могли бы рассмотреть возможность установки типа MIME, чтобы указать, что вы возвращаете JSON, хотя (согласно этому другому посту 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();
user241924
источник
7
Это помогло мне. Как упоминалось в ответе Марка Эллиота, 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);
}

Вот и все.

Смотрите также:

BalusC
источник
Я делаю это, чтобы отправить ответ на javascript и отображать ответ в оповещении. почему он отображает HTML-код внутри оповещения ... почему я получаю HTML-код в качестве ответа. я сделал то же самое, что ты сказал.
Абхи
У меня та же проблема, что и у @iLive
Wax
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( edit : 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": "Мачадо", "datosCriticos": [{ "Edad": 12}]}

Нужно сказать людям, если ваши vars пустые при использовании 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();
ravthiru
источник
7

Для удобства программирования Java может существовать объект JSON. Но, наконец, структура данных будет сериализована в строку. Установка правильного типа 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 ( "текст / JSON");

// создаем строку JSON, я предлагаю использовать некоторые фреймворки.

Строка your_string;

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

RHT
источник
мне нужно использовать getBytes ("UTF-8")) или я могу просто вернуть переменную String?
Анкур
Безопасная практика программирования - использовать UTF-8 для кодирования ответа веб-приложения.
RHT
0

Рядом с BalusC ответ в 4 простых строчках, используя Google Gson lib. Добавьте эти строки в метод сервлета:

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

xrcwrn
источник
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

Энамул Хак
источник