JavaサーブレットからJSONオブジェクトを返す方法


153

JavaサーブレットからJSONオブジェクトをどのように返しますか?

以前は、サーブレットでAJAXを実行すると、文字列が返されました。使用する必要があるJSONオブジェクトタイプはありますか、またはJSONオブジェクトのような文字列を返すだけですか?

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

10
Nitpick; もっと好きになりません{ key1: value1, key2: value2 }か?

14
Nitpick:彼が本当に望んでいるのは{"key1": "value1"、 "key2": "value2"} ... :-)
PhiLho

Spring 3.2.0を使用する場合は、@ Ankurでリンクをチェックアウトしてください
AmirHd 2013年

5
Nitpick:値が文字列であると想定すべきではないため、彼が本当に望んでいるのは{"key1":value1、 "key2":value2}
NoBrainer

これらのNitpick(特にこの順序で)は壮大です:)
Ankur

回答:



175

JSONオブジェクトを応答オブジェクトの出力ストリームに書き込みます。

また、コンテンツタイプを次のように設定する必要があります。これにより、返される内容が指定されます。

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
これは私を助けました。Mark Elliotの回答で述べたように、jsonObjectはjsonとしてフォーマットされた単なる文字列にすることができます。一重引用符は有効なjsonを提供しないため、二重引用符を使用することを忘れないでください。例:String jsonStr = "{\"my_key\": \"my_value\"}";
marcelocra 2014

3
response.setCharacterEncoding( "utf-8");を使用するとよいでしょう。あまりにも
erhun

81

まず、JSONオブジェクトをに変換しますString。次にapplication/json、UTF-8のコンテンツタイプと文字エンコーディングとともに、それを応答ライターに書き出します。

以下は、Google Gsonを使用してJavaオブジェクトを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);
}

それで全部です。

以下も参照してください。


私はこれをJavaScriptへの応答を送信し、警告で応答を表示するために行っています。なぜアラート内にhtmlコードが表示されるのですか。応答としてhtmlコードを取得するのはなぜですか。私はあなたが言ったようにまったく同じことをしました。
Abhi

@iLiveと同じ問題があります
ワックス

30

JavaサーブレットからJSONオブジェクトを返す方法

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

バージョンによっては、JsonObjectは抽象的です。新しい実装への回答を作成しました。
Rafael Barros

8

文字列を出力ストリームに書き込むだけです。参考になれば、MIME-typeをtext/javascripteditapplication/jsonどうやら公式に)に設定するかもしれません。(いつか何かがめちゃくちゃにならないようにする可能性は小さいですが、ゼロではない可能性があり、それは良い習慣です。)


8

Gsonはこれに非常に役立ちます。簡単です。これが私の例です:

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

gsonを使用しているときにvarsが空の場合は、jsonがビルドされないので、人に言わなければなりません。

{}


8

私が使用ジャクソンを次のようにJSON文字列と送信するためにJavaオブジェクトを変換します。

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コーディングに便利なJSONオブジェクトが存在する場合があります。しかし、最後にデータ構造は文字列にシリアル化されます。適切なMIMEタイプを設定するとよいでしょう。

json.orgのJSON Java勧めします


不正解です。通常、aを作成するオーバーヘッドを追加する理由はありません。String出力はそのまま送信されOutputStreamます。または、何らかの理由で中間形式が必要な場合は、を使用できますbyte[]。ほとんどのJava JSONライブラリはに直接書き込むことができますOutputStream
StaxMan 2013年

7

Javaのバージョン(またはJDK、SDK、JREなど)によっては、Javaエコシステムの新機能ですが、これJsonObjectは抽象的です。したがって、これは新しい実装です。

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

// JSON文字列を作成します。フレームワークを使用することをお勧めします。

文字列your_string;

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


getBytes( "UTF-8"))を使用する必要がありますか、それともString変数を返すだけですか?
Ankur

Webアプリケーションの応答をエンコードするためにUTF-8を使用するのは安全なプログラミング方法です。
RHT

0

Google Gson libを使用した4つの簡単な行でBalusC回答に近い。次の行をサーブレットメソッドに追加します。

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

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

幸運を!


0

Gsonを使用すると、json応答を送信できます以下のコードを参照してください

あなたはこのコードを見ることができます

@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のサーブレットからのjson応答から有用


0

ベローズのように使えます。

json配列を使用する場合:

  1. json-simple-1.1.1.jarをダウンロード してプロジェクトのクラスパスに追加します
  2. 以下のようなModelという名前のクラスを作成します。

    public class Model {
    
     private String id = "";
     private String name = "";
    
     //getter sertter here
    }
  3. sevlet getMethodでは、次のように使用できます

    @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. 出力

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

私はあなたがjsonオブジェクトにちょうど使用したい:

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

}

上記の機能出力

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

完全なソースはGitHubに提供されています:https : //github.com/enamul95/ServeletJson.git

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.