Wie geben Sie ein JSON-Objekt von einem Java-Servlet zurück?

153

Wie geben Sie ein JSON-Objekt aus einem Java-Servlet zurück?

Zuvor habe ich beim Ausführen von AJAX mit einem Servlet eine Zeichenfolge zurückgegeben. Gibt es einen JSON-Objekttyp, der verwendet werden muss, oder geben Sie einfach einen String zurück, der wie ein JSON-Objekt aussieht, z

String objectToReturn = "{ key1: 'value1', key2: 'value2' }";
Ankur
quelle
10
Nitpick; solltest du nicht mehr wollen { key1: value1, key2: value2 }?
14
Nitpick: Was er wirklich will, ist {"key1": "value1", "key2": "value2"} ... :-)
PhiLho
@Ankur Überprüfen Sie den Link, wenn Sie sich für Spring 3.2.0 entschieden haben.
AmirHd
5
Nitpick: Wir sollten nicht annehmen, dass die Werte Strings sind, also will er wirklich {"key1": value1, "key2":
value2
Diese Nitpicks (besonders in dieser Reihenfolge) sind episch :)
Ankur

Antworten:

175

Schreiben Sie das JSON-Objekt in den Ausgabestream des Antwortobjekts.

Sie sollten den Inhaltstyp auch wie folgt festlegen, um anzugeben, was Sie zurückgeben:

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
quelle
7
Das hat mir geholfen. Wie in der Antwort von Mark Elliot erwähnt, kann jsonObject nur eine Zeichenfolge sein, die als json formatiert ist. Denken Sie daran, doppelte Anführungszeichen zu verwenden, da einfache Anführungszeichen keinen gültigen JSON ergeben. Bsp.:String jsonStr = "{\"my_key\": \"my_value\"}";
Marcelocra
3
Es ist gut, response.setCharacterEncoding ("utf-8") zu verwenden. auch
erhun
81

Konvertieren Sie zuerst das JSON-Objekt in String. Dann schreiben Sie es einfach zusammen mit dem Inhaltstyp application/jsonund der Zeichenkodierung von UTF-8 an den Antwortschreiber .

In diesem Beispiel wird davon ausgegangen, dass Sie Google Gson verwenden , um ein Java-Objekt in eine JSON-Zeichenfolge zu konvertieren:

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

Das ist alles.

Siehe auch:

BalusC
quelle
Ich mache das, um eine Antwort auf Javascript zu senden und die Antwort in Alarmbereitschaft anzuzeigen. Warum wird der HTML-Code in der Warnung angezeigt? Warum erhalte ich den HTML-Code als Antwort? Ich habe genau das Gleiche getan, wie du gesagt hast.
Abhi
Ich habe das gleiche Problem wie @iLive
Wax
30

Wie geben Sie ein JSON-Objekt von einem Java-Servlet zurück?

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
quelle
Je nach Version ist JsonObject abstrakt. Ich habe eine Antwort auf eine neuere Implementierung erstellt.
Rafael Barros
8

Schreiben Sie einfach eine Zeichenfolge in den Ausgabestream. Sie können den MIME-Typ auf text/javascript( bearbeiten : application/jsonist anscheinend offizieller) setzen, wenn Sie sich hilfreich fühlen. (Es gibt eine kleine Chance, aber ungleich Null, dass etwas davon abhält, es eines Tages durcheinander zu bringen, und es ist eine gute Praxis.)


quelle
8

Gson ist dafür sehr nützlich. noch einfacher. Hier ist mein Beispiel:

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

Ich muss sagen, Leute, wenn deine Vars leer sind, wenn du gson verwendest, wird es den json nicht für dich bauen

{}

superUser
quelle
8

Ich habe Jackson verwendet , um Java Object in eine JSON-Zeichenfolge zu konvertieren und wie folgt zu senden.

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
quelle
7

Möglicherweise gibt es ein JSON-Objekt, um die Java-Codierung zu vereinfachen. Zuletzt wird die Datenstruktur jedoch in einen String serialisiert. Es wäre schön, einen richtigen MIME-Typ einzustellen.

Ich würde JSON Java von json.org vorschlagen .

Null
quelle
Falsch. Es gibt normalerweise keinen Grund, den Aufwand für die Erstellung einer StringAusgabe zu erhöhen OutputStream. Oder, wenn Zwischenform aus irgendeinem Grund benötigt wird, kann verwenden byte[]. Die meisten Java JSON-Bibliotheken können direkt in schreiben OutputStream.
StaxMan
7

Abhängig von der Java-Version (oder JDK, SDK, JRE ... ich weiß nicht, ich bin neu im Java-Ökosystem) ist das JsonObjectabstrakt. Das ist also eine neue Implementierung:

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
quelle
3

response.setContentType ("text / json");

// erstelle die JSON-Zeichenfolge, ich schlage vor, ein Framework zu verwenden.

String your_string;

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

RHT
quelle
Muss ich getBytes ("UTF-8") verwenden oder kann ich einfach die String-Variable zurückgeben?
Ankur
Es ist eine sichere Programmierpraxis, UTF-8 zum Codieren der Antwort einer Webanwendung zu verwenden.
RHT
0

Nahe an BalusC Antwort in 4 einfachen Zeilen mit Google Gson lib. Fügen Sie diese Zeilen zur Servlet-Methode hinzu:

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

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

Viel Glück!

Panayot Kulchev
quelle
0

Mit Gson können Sie eine JSON-Antwort senden (siehe Code unten)

Sie können diesen Code sehen

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

  }
}

hilfreich von json Antwort von Servlet in Java

xrcwrn
quelle
0

Sie können unten wie verwenden.

Wenn Sie ein JSON-Array verwenden möchten:

  1. Laden Sie json-simple-1.1.1.jar herunter und fügen Sie es Ihrem Projektklassenpfad hinzu
  2. Erstellen Sie eine Klasse mit dem Namen Model wie unten

    public class Model {
    
     private String id = "";
     private String name = "";
    
     //getter sertter here
    }
  3. In sevlet getMethod können Sie wie unten verwenden

    @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. Ausgabe :

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

Ich möchte, dass json Object wie folgt verwendet:

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

}

Über der Funktion Ausgabe :

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

Die vollständige Quelle wird GitHub zur Verfügung gestellt: https://github.com/enamul95/ServeletJson.git

Enamul Haque
quelle