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' }";
Ankur
źródło
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”).

Mark Elliot
źródło
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();
user241924
źródło
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ż:

BalusC
źródło
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());
MAnoj Sarnaik
źródło
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).


źródło
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.

{}

superUser
źródło
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();
ravthiru
źródło
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 .

zero
źródło
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());
}
Rafael Barros
źródło
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"));

RHT
źródło
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!

Panayot Kulchev
źródło
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

xrcwrn
źródło
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

Enamul Haque
źródło