Bir Java Servlet'ten JSON nesnesini nasıl döndürürsünüz?


153

Bir Java sunucu uygulamasından bir JSON nesnesini nasıl döndürürsünüz?

Daha önce bir sunucu uygulaması ile AJAX yaparken bir dize döndü. Kullanılması gereken bir JSON nesne türü var mı, yoksa yalnızca JSON nesnesine benzeyen bir String döndürüyor musunuz?

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

10
Kusur aramak; daha çok istememelisin { key1: value1, key2: value2 }?

14
Nitpick: Gerçekten istediği şey {"key1": "value1", "key2": "
value2

@ Spring 3.2.0 kullanmaya karar verirseniz bağlantıyı kontrol edin .
AmirHd

5
Nitpick: değerlerin Dizeler olduğunu varsaymamalıyız, bu yüzden gerçekten istediği şey {"key1": değer1, "
key2

Bu Nitpicks (özellikle bu sırayla) destansı :)
Ankur

Yanıtlar:



175

JSON nesnesini yanıt nesnesinin çıkış akışına yazın.

Ayrıca, ne tür bir geri dönüş yapacağınızı belirten içerik türünü aşağıdaki gibi ayarlamanız gerekir:

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
Bu bana yardımcı oldu. Mark Elliot yanıtında belirtildiği gibi, jsonObject sadece json olarak biçimlendirilmiş bir dize olabilir. Tek tırnak size geçerli bir json vermeyeceğinden çift tırnak kullanmayı unutmayın. Örn .:String jsonStr = "{\"my_key\": \"my_value\"}";
marcelocra

3
Response.setCharacterEncoding ("utf-8") kullanmak iyi olacaktır; çok
erhun

81

Önce JSON nesnesini dönüştürün String. Daha sonra application/jsonUTF-8'in içerik türü ve karakter kodlaması ile birlikte yanıt yazara yazmanız yeterlidir .

Java nesnesini JSON dizesine dönüştürmek için Google Gson'u kullandığınızı varsayan bir örnek :

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

Bu kadar.

Ayrıca bakınız:


Javascript'e yanıt göndermek ve yanıtı uyarı olarak görüntülemek için yapıyorum. neden uyarı içinde html kodu görüntüleniyor .. neden cevap olarak html kodu alıyorum. söylediğin gibi aynı şeyi yaptım.
Abhi

@İLive ile aynı sorunum var
Balmumu

30

Bir Java Servlet'ten JSON nesnesini nasıl döndürürsünüz?

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

Sürüme bağlı olarak JsonObject soyuttur. Daha yeni bir uygulamaya cevap verdim.
Rafael Barros

8

Çıkış akışına bir dize yazmanız yeterlidir. Kendinizi yararlı hissediyorsanız MIME türünü text/javascript( düzenle : application/jsongörünüşe göre resmi) olarak ayarlayabilirsiniz . (Bir şeylerin bir gün onu karıştırmasını önleyecek küçük ama sıfır olmayan bir şans var ve bu iyi bir uygulama.)


8

Gson bunun için çok yararlı. daha kolay. İşte benim örnek:

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

Eğer gson kullanırken sizinkiler boşsa, insanları sizin için json inşa etmeyeceklerini söylemek zorundasınız.

{}


8

Java Object'i JSON dizesine dönüştürmek ve aşağıdaki gibi göndermek için Jackson'ı kullandım .

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

Java kodlama kolaylığı için bir JSON nesnesi olabilir. Ancak sonunda veri yapısı dizgiye serileştirilecektir. Uygun bir MIME türü ayarlamak iyi olurdu.

Ben öneririm JSON Java dan json.org .


Yanlış. Genellikle a String- çıktının doğrudan yapılması gereken ek yükü eklemek için bir neden yoktur OutputStream. Veya, herhangi bir nedenle ara form gerekiyorsa, kullanabilirsiniz byte[]. Çoğu Java JSON kütüphanesi doğrudanOutputStream .
StaxMan

7

Java sürümüne (veya JDK, SDK, JRE ... i dunno, Java ekosisteminde yeni im) JsonObjectbağlı olarak soyuttur. Yani, bu yeni bir uygulama:

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 ( "metin / json");

// JSON dizesi oluşturmak, bazı çerçeve kullanmanızı öneririm.

Dizenizi_gizleyin;

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


("UTF-8")) kullanmam gerekir mi yoksa sadece String değişkenini döndürebilir miyim?
Ankur

Bir web uygulamasının yanıtını kodlamak için UTF-8 kullanmak güvenli bir programlama uygulamasıdır.
RHT

0

Yakın BalusC tarihinde GSON lib kullanılarak 4 basit hatlarında cevap. Bu satırları sunucu uygulaması yöntemine ekleyin:

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

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

İyi şanslar!


0

Gson'u kullanarak json yanıtı gönderebilirsiniz aşağıdaki koda bakın

Bu kodu görebilirsiniz

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

  }
}

Java servlet gelen json yanıt yardımcı


0

Körük gibi kullanabilirsiniz.

Json dizisini kullanmak istiyorsanız:

  1. indir json-simple-1.1.1.jar & proje sınıfı yoluna ekle
  2. Feryat gibi Model adında bir sınıf oluşturun

    public class Model {
    
     private String id = "";
     private String name = "";
    
     //getter sertter here
    }
  3. Sevlet getMethod'da feryat gibi kullanabilirsiniz

    @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. Çıktı :

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

Json Object sadece gibi kullanmak istiyorum:

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

}

Yukarıdaki fonksiyonu Çıkışı :

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

GitHub'a tam kaynak verilir: https://github.com/enamul95/ServeletJson.git

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.