0

次の目的を持つサーブレットがあります。

URL を介して (つまり、get を使用して) データを受信します。次に、この入力に基づいてメッセージを呼び出し元に返します。私はこのようなことは初めてですが、json (実際には Gson) を使用することがこれに適していることを学びました。

私の質問は、このjsonメッセージを取得するにはどうすればよいですか? どの URL をターゲットにするか? サーブレットの関連する行は次のとおりです。

String json = new Gson().toJson(thelist);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().println(json);

これは、jsonを取得しようとする方法です:

try{
            DefaultHttpClient defaultClient = new DefaultHttpClient();
            HttpGet httpGetRequest = new HttpGet("http://AnIPno:8181/sample/response?first=5&second=92866");
            HttpResponse httpResponse = defaultClient.execute(httpGetRequest);
            BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
            String json = reader.readLine();
            JSONObject jsonObject = new JSONObject(json);

} catch(Exception e){
            e.printStackTrace();
        }

しかし、jsonObject のサイズが 0 であることがわかったため、明らかにこれは機能しません (3 つの要素を持つ配列である必要があります)。

以前は、サーブレットに println() の代わりに write() がありました。この場合、それが重要かどうかはわかりません。しかし、json オブジェクトの取得方法について何か誤解していると思います。サーブレットの URL を指すだけでは不十分ですか?

4

2 に答える 2

0

InputStreamファイル システム上のファイルまたは HTTP 要求からの読み取りは、ほとんどの場合同じです。

サーブレットが単一行を書き込んだ場合にのみ、あなたが持っているものは正しいです。Gsonオブジェクトメソッドが複数の行を返す場合、toString()から複数の行を読み取る必要がありますInputStreamScannerからの読み取りにクラスを使用するのが好きInputStreamです。

try {
    DefaultHttpClient defaultClient = new DefaultHttpClient();
    HttpGet httpGetRequest = new HttpGet("http://localhost:8080/cc/jsonyeah");
    HttpResponse httpResponse = defaultClient.execute(httpGetRequest);

    Scanner scanner = new Scanner(httpResponse.getEntity().getContent(), "UTF-8");       

    while(scanner.hasNextLine()) { // scanner looks ahead for an end-of-line
        json += scanner.nextLine() + "\n"; // read the full line, you can append a \n
    }               
    // do your serialization
} catch(Exception e) {
      e.printStackTrace();
}

したがって、ファイルから読み取る場合と同じことを行いました。jsonオブジェクトには、サーブレットから受け取った jsonがString.

シリアル化には、いくつかのオプションがあります。

Gsonオブジェクトには、や などfromJson()を取ることができるオーバーロードされたメソッドがあります。StringReader

上記のコードの場所から、次のことができます

MyClass instance = new Gson().fromJson(json, MyClass.class);

MyClass作成しようとしている型はどこにありますか。TypeTokenジェネリック クラス (リストなど) には を使用する必要があります。TypeTokenは抽象クラスなので、無名クラスを生成して呼び出すgetType()

Type type = new com.google.gson.reflect.TypeToken<List<String>>(){}.getType();
List<MyClass> list = new Gson().fromJson(json, type);

もう 1 つのオプションは、InputStream から 1 行ずつ読み取る代わりに、Reader を直接受け取るオーバーロードされたメソッドを使用することです。

BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
MyClass instance = new Gson().fromJson(reader , MyClass.class);

ステップをスキップできます。

ストリームを閉じることを忘れないでください。

于 2013-04-24T22:02:01.817 に答える
0

リクエストからJSON文字列にJsonDataを読み取るこの関数があります。この関数を使用して JSON を取得し、GSON を使用してそれを解析して目的のオブジェクトにすることができます。それは私のアプリケーションで機能します。それがあなたにとってもうまくいくことを願っています。

    protected String readJson(HttpResponse resp)
        throws IOException {

        BufferedReader reader = null;  

        try {
            reader = new BufferedReader(new InputStreamReader(
                    resp.getEntity().getContent()));
            StringBuffer buffer = new StringBuffer();
            int read;
            char[] chars = new char[1024];
            while ((read = reader.read(chars)) != -1)
                buffer.append(chars, 0, read);
        } finally {
            if (reader != null)
                reader.close();
        }
        return buffer.toString();
    }

したがって、コードに基づいています。私はこれがうまくいくと思います:

String jsonData = readJson(httpResponse);
YourObject obj = new Gson().fromJson(jsonData, YourObject.class);

これを試す前に、サーブレットが必要な JSON データを出力することを確認してください。サーブレットからのデータをテストするには、次の Chrome 拡張機能を使用することをお勧めします: Postman - REST Client および JSON Formatter。それはかなり役に立ちます。

于 2013-04-24T19:29:55.377 に答える