2017-09-01 5 views
0

SwingアプリケーションからWebアプリケーションにHashMapを送信したいとします.HashMapタイプです。 1つのString、ArrayList、およびByte Arrayが含まれています。 Webアプリケーションでこのマップを取得したいと思います。URLConnectionを使用してマップを送信および取得します。

スイング側のコード:

private static void sendMap() 
    { 
     System.out.println("Sending MAP"); 
     byte[] bytes=getByteArray(); 
     ArrayList<String> list =new ArrayList<String>(); 
     list.add("ABC"); 
     list.add("XYZ"); 
     list.add("ABXY"); 
     Map<String, Object> params=new HashMap<String, Object>(); 
     params.put("Type", "Document"); 
     params.put("bytes", bytes); 
     params.put("PartyNameList", list); 

     try { 
      URL url= new URL(iinkiturl+"/getMap?id=1234567"); 
      URLConnection uc = url.openConnection(); 
      uc.setDoOutput(true); 
      uc.setDoInput(true); 
      uc.setAllowUserInteraction(false); 

      DataOutputStream dstream = new DataOutputStream(uc.getOutputStream()); 

      // The POST line 
      System.out.println(toByteArray(params)); 
      dstream.write(params.toString().getBytes()); 
      dstream.close(); 

      InputStream in = uc.getInputStream(); 
      int x; 
      while ((x = in.read()) != -1) { 
       System.out.write(x); 
      } 
      in.close(); 

      BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
      StringBuffer buf = new StringBuffer(); 
      String line; 
      while ((line = r.readLine()) != null) { 
       buf.append(line); 
      } 


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


    } 

Webアプリケーション側:

 InputStream in = request.getInputStream(); 
     BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
     StringBuffer buf = new StringBuffer(); 
     String line; 
     while ((line = r.readLine())!=null) { 
     buf.append(line); 
     } 
     System.out.println("Buffer ======= "+buf.toString()); 

出力:

バッファ======= {タイプ=ファイリング、PartyNameList = [ABC、 XYZ、ABXY]、bytes = [B @ 24c0f1ec}

このバッファからどのようにしてMapオブジェクトを取得できますか?または、これを達成するための代替ソリューションがありますか?前もって感謝します。

+1

生産し、Javaでそれらを消費するXMLまたはJSON表記、およびAPIを参照してください... –

+0

使用Arrays.toStringへバイト配列 –

+0

を修正します。通常、プロジェクトはいくつかのフレームワーク上で構築されます。ほぼすべてが引数をエンコード/デコードするコンセプトを持っています。 –

答えて

0

JSONを使用して私の問題を解決しました。

スイング側のコード:

private static void sendMap() 
    { 
     System.out.println("Sending MAP"); 
     ArrayList<String> list =new ArrayList<String>(); 
     list.add("ABC"); 
     list.add("XYZ"); 
     list.add("ABXY"); 
     Map<String, Object> params=new HashMap<String, Object>(); 
     params.put("Type", "Document"); 
     params.put("bytes", getByteArray()); 
     params.put("NameList", list); 

     try { 
      URL url= new URL(iinkiturl+"/getMap?id=1234567"); 
      URLConnection uc = url.openConnection(); 
      uc.setDoOutput(true); 
      uc.setDoInput(true); 
      uc.setAllowUserInteraction(false); 

      DataOutputStream dstream = new DataOutputStream(uc.getOutputStream()); 

      dstream.write(new com.google.gson.Gson().toJson(params).getBytes()); 
      dstream.close(); 

      InputStream in = uc.getInputStream(); 
      int x; 
      while ((x = in.read()) != -1) { 
       System.out.write(x); 
      } 
      in.close(); 

      BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
      StringBuffer buf = new StringBuffer(); 
      String line; 
      while ((line = r.readLine()) != null) { 
       buf.append(line); 
      } 


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


    } 

Webアプリケーションサイド:

InputStream in = request.getInputStream(); 
BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
StringBuffer buf = new StringBuffer(); 
String line; 
while ((line = r.readLine())!=null) { 
    buf.append(line); 
} 


Map<String,Object> map=convertJsonToMap(buf.toString()); 

private Map<String, Object> convertJsonToMap(String json) { 

     Map<String, Object> map = new HashMap<String, Object>(); 
     ObjectMapper mapper = new ObjectMapper(); 
     try { 

      // convert JSON string to Map 
      map = mapper.readValue(json,new TypeReference<HashMap<String, Object>>() {}); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return map; 
    } 
1

toString()メソッドを使用しています。そこからデシリアライズを行うことはできません。 JSONまたはJavaのシリアライズツールを使用して、マップを転送可能な状態(ビュー)に移動します。そしてクライアント側の同じツールでそれを逆シリアル化します。

+0

何もデシリアライズできません(バイト配列が正しく出力された場合)。カスタムパーサーが必要です。 –

+0

@ cricket_007そうは思わないです。真に直列化されたオブジェクトだけをデシリアライズすることができます。 'Anything'は逆シリアル化できません。 – ruslanys

+0

一貫してフォーマットされた文字列をデシリアライズすることができます; –

0

toString()を使用すると、HashMapの文字列表現が生成され、実際のHashMapではなくネットワーク経由で送信されるため、Webアプリケーション側でその表現が表示されます。

ObjectOutputStream/ObjectInputStreamクラスを使用して、HashMapを送受信する必要があります。

ObjectOutputStream/ObjectInputStreamは、特にネットワーク経由でオブジェクトを送信することに関係しています。

は、しかし、これはあなたが(このプロセスは、としてシリアライズと呼ばれる) ネットワーク経由で送信したいすべてのオブジェクトはマーカーインターフェイスでSerializableインタフェースを実装しなければならないことが必要です。

関連する問題