Comment renvoyer un objet JSON à partir d'un servlet Java

153

Comment renvoyer un objet JSON à partir d'un servlet Java.

Auparavant, en faisant AJAX avec un servlet, j'ai renvoyé une chaîne. Y a-t-il un type d'objet JSON qui doit être utilisé, ou renvoyez-vous simplement une chaîne qui ressemble à un objet JSON, par exemple

String objectToReturn = "{ key1: 'value1', key2: 'value2' }";
Ankur
la source
10
Nitpick; tu ne devrais pas en vouloir plus { key1: value1, key2: value2 }?
14
Nitpick: ce qu'il veut vraiment, c'est {"key1": "value1", "key2": "value2"} ... :-)
PhiLho
@Ankur consultez le lien si vous avez décidé d'utiliser Spring 3.2.0.
AmirHd
5
Nitpick: nous ne devrions pas supposer que les valeurs sont des chaînes, donc ce qu'il veut vraiment, c'est {"key1": value1, "key2": value2}
NoBrainer
Ces Nitpicks (en particulier dans cet ordre), sont épiques :)
Ankur

Réponses:

57

Je fais exactement ce que vous suggérez (retournez a String).

Cependant, vous pouvez envisager de définir le type MIME pour indiquer que vous retournez JSON (selon cet autre article de stackoverflow, c'est "application / json").

Mark Elliot
la source
175

Écrivez l'objet JSON dans le flux de sortie de l'objet de réponse.

Vous devez également définir le type de contenu comme suit, qui spécifiera ce que vous renvoyez:

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
la source
7
Cela m'a aidé. Comme mentionné dans la réponse de Mark Elliot, jsonObject pourrait être juste une chaîne formatée en json. N'oubliez pas d'utiliser des guillemets doubles, car les guillemets simples ne vous donneront pas de json valide. Ex .:String jsonStr = "{\"my_key\": \"my_value\"}";
marcelocra
3
Il sera bon d'utiliser response.setCharacterEncoding ("utf-8"); trop
erhun
81

Commencez par convertir l'objet JSON en String. Ensuite, écrivez-le simplement au rédacteur de réponse avec le type de contenu application/jsonet le codage de caractères de UTF-8.

Voici un exemple en supposant que vous utilisez Google Gson pour convertir un objet Java en chaîne 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);
}

C'est tout.

Voir également:

BalusC
la source
Je fais cela pour envoyer une réponse à javascript et afficher la réponse en alerte. pourquoi affiche-t-il le code html à l'intérieur de l'alerte .. pourquoi est-ce que je reçois le code html en réponse. J'ai fait exactement la même chose que tu l'as dit.
Abhi
J'ai le même problème que @iLive
Wax
30

Comment renvoyer un objet JSON à partir d'un servlet 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
la source
Selon la version, JsonObject est abstrait. J'ai créé une réponse à une implémentation plus récente.
Rafael Barros
8

Écrivez simplement une chaîne dans le flux de sortie. Vous pouvez définir le type MIME sur text/javascript( edit : application/jsonest apparemment officialer) si vous vous sentez utile. (Il y a une petite chance non nulle que cela empêche quelque chose de le gâcher un jour, et c'est une bonne pratique.)


la source
8

Gson est très utile pour cela. plus facile même. voici mon exemple:

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

Je dois dire aux gens si les vars sont vides lors de l'utilisation de gson, il ne construira pas le json pour vous.

{}

superutilisateur
la source
8

J'ai utilisé Jackson pour convertir l'objet Java en chaîne JSON et l'envoyer comme suit.

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
la source
7

Il peut y avoir un objet JSON pour faciliter le codage Java. Mais enfin, la structure de données sera sérialisée en chaîne. Définir un type MIME approprié serait bien.

Je suggérerais JSON Java de json.org .

néant
la source
Incorrect. Il n'y a généralement aucune raison d'ajouter une surcharge de construction String- la sortie doit aller directement à OutputStream. Ou, si une forme intermédiaire est nécessaire pour une raison quelconque, peut utiliser byte[]. La plupart des bibliothèques Java JSON peuvent écrire directement dans OutputStream.
StaxMan
7

Selon la version de Java (ou JDK, SDK, JRE ... je ne sais pas, je suis nouveau dans l'écosystème Java), JsonObjectc'est abstrait. Donc, ceci est une nouvelle implémentation:

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
la source
3

response.setContentType ("text / json");

// crée la chaîne JSON, je suggère d'utiliser un framework.

String your_string;

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

RHT
la source
dois-je utiliser getBytes ("UTF-8")) ou puis-je simplement renvoyer la variable String?
Ankur
C'est une pratique de programmation sûre d'utiliser UTF-8 pour encoder la réponse d'une application Web.
RHT
0

Proche de la réponse BalusC en 4 lignes simples en utilisant Google Gson lib. Ajoutez ces lignes à la méthode servlet:

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

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

Bonne chance!

Panayot Kulchev
la source
0

En utilisant Gson, vous pouvez envoyer une réponse json, voir le code ci-dessous

Vous pouvez voir ce code

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

  }
}

utile de la réponse json du servlet en java

xrcwrn
la source
0

Vous pouvez utiliser ci-dessous comme.

Si vous voulez utiliser le tableau json:

  1. téléchargez json-simple-1.1.1.jar et ajoutez à votre chemin de classe de projet
  2. Créer une classe nommée Model comme ci-dessous

    public class Model {
    
     private String id = "";
     private String name = "";
    
     //getter sertter here
    }
  3. Dans sevlet getMethod, vous pouvez utiliser comme ci-dessous

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

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

Je veux que json Object utilise simplement comme:

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

}

Sortie de fonction ci-dessus :

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

La source complète est donnée à GitHub: https://github.com/enamul95/ServeletJson.git

Enamul Haque
la source