Jak zwrócić obiekt JSON z serwletu Java


153

Jak zwrócić obiekt JSON z serwletu Java.

Wcześniej podczas wykonywania AJAX z serwletem zwracałem łańcuch. Czy istnieje typ obiektu JSON, którego należy użyć, czy po prostu zwracasz String, który wygląda jak obiekt JSON, np.

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

10
Nitpick; nie powinieneś chcieć więcej jak { key1: value1, key2: value2 }?

14
Nitpick: naprawdę chce {"key1": "value1", "key2": "value2"} ... :-)
PhiLho

@Ankur sprawdź link, jeśli zdecydowałeś się użyć Spring 3.2.0.
AmirHd,

5
Nitpick: nie powinniśmy zakładać, że wartości są ciągami znaków, więc on naprawdę chce to {"key1": value1, "key2":
value2

Te Nitpicks (szczególnie w tej kolejności) są epickie :)
Ankur

Odpowiedzi:


57

Robię dokładnie to, co sugerujesz (powrót a String).

Możesz jednak rozważyć ustawienie typu MIME, aby wskazać, że zwracasz JSON (zgodnie z tym innym postem stosu jest to „application / json”).


175

Zapisz obiekt JSON w strumieniu wyjściowym obiektu odpowiedzi.

Powinieneś także ustawić typ zawartości w następujący sposób, który określi, co zwracasz:

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
To mi pomogło. Jak wspomniano w odpowiedzi Marka Elliota, jsonObject może być po prostu ciągiem sformatowanym jako json. Pamiętaj, aby używać podwójnych cudzysłowów, ponieważ pojedyncze cudzysłowy nie dają prawidłowego pliku json. Np .:String jsonStr = "{\"my_key\": \"my_value\"}";
marcelocra

3
Dobrze będzie użyć response.setCharacterEncoding ("utf-8"); też
erhun

81

Najpierw przekonwertuj obiekt JSON na String. Następnie po prostu wyślij go do programu zapisującego odpowiedź wraz z typem zawartości application/jsoni kodowaniem znaków UTF-8.

Oto przykład zakładający, że używasz Google Gson do konwersji obiektu Java na ciąg 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);
}

To wszystko.

Zobacz też:


Robię to, aby wysłać odpowiedź do javascript i wyświetlić odpowiedź w alercie. dlaczego wyświetla kod html wewnątrz alertu ... dlaczego otrzymuję kod HTML w odpowiedzi. zrobiłem dokładnie to samo, co powiedziałeś.
Abhi

Mam ten sam problem, co @iLive
Wosk

30

Jak zwrócić obiekt JSON z serwletu 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());

W zależności od wersji JsonObject jest abstrakcyjny. Stworzyłem odpowiedź na nowszą implementację.
Rafael Barros

8

Po prostu napisz ciąg znaków do strumienia wyjściowego. Możesz ustawić typ MIME na text/javascript( edit : application/jsonjest najwyraźniej oficjalny), jeśli czujesz się pomocny. (Istnieje niewielka, ale niezerowa szansa, że ​​pewnego dnia coś zepsuje i jest to dobra praktyka).


8

Gson jest do tego bardzo przydatny. jeszcze łatwiejsze. oto mój przykład:

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

Muszę powiedzieć ludziom, że jeśli twoje vary są puste, gdy używasz gson, nie zbuduje dla ciebie json.

{}


8

Użyłem Jacksona do konwersji obiektu Java na ciąg JSON i wysłania w następujący sposób.

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

Może istnieć obiekt JSON ułatwiający kodowanie w języku Java. Ale w końcu struktura danych zostanie serializowana do łańcucha. Przydałoby się ustawienie odpowiedniego typu MIME.

Proponuję JSON Java z json.org .


Błędny. Zwykle nie ma powodu do dodawania narzutu konstruowania a String- wyjście powinno iść prosto do OutputStream. Lub, jeśli z jakiegoś powodu potrzebna jest forma pośrednia, można użyć byte[]. Większość bibliotek Java JSON może pisać bezpośrednio do OutputStream.
StaxMan

7

W zależności od wersji Javy (lub JDK, SDK, JRE ... nie wiem, jestem nowy w ekosystemie Java), JsonObjectjest abstrakcyjny. To jest nowa implementacja:

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

// utwórz ciąg JSON, sugeruję użycie jakiegoś frameworka.

String your_string;

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


czy muszę używać getBytes („UTF-8”)), czy mogę po prostu zwrócić zmienną typu String?
Ankur

Bezpieczną praktyką programistyczną jest używanie UTF-8 do kodowania odpowiedzi aplikacji internetowej.
RHT

0

Blisko odpowiedzi BalusC w 4 prostych wierszach za pomocą Google Gson lib. Dodaj następujące wiersze do metody serwletu:

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

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

Powodzenia!


0

Za pomocą Gson możesz wysłać odpowiedź json, patrz poniższy kod

Możesz zobaczyć ten kod

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

  }
}

pomocny w odpowiedziach json z serwletu w java


0

Możesz użyć poniżej jak.

Jeśli chcesz użyć tablicy json:

  1. pobierz json-simple-1.1.1.jar i dodaj do ścieżki klasy projektu
  2. Utwórz klasę o nazwie Model, jak poniżej

    public class Model {
    
     private String id = "";
     private String name = "";
    
     //getter sertter here
    }
  3. W sevlet getMethod można używać jak poniżej

    @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. Wyjście :

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

I you want json Object po prostu użyj:

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

}

Powyżej wyjścia funkcji :

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

Pełne źródło podaje GitHub: https://github.com/enamul95/ServeletJson.git

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.