2017-09-01 95 views
0

我想從Swing應用程序發送HashMap到Web Application.HashMap類型爲。它包含一個字符串,ArrayList和字節數組。我想在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],字節= [B @ 24c0f1ec}

如何從此緩衝區獲取Map對象。或者是否有任何替代解決方案來實現這一點。提前致謝。

+1

見XML或JSON對象,而相應的API,以生產和在Java中使用它們... –

+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序列化工具將Map移動到可轉移狀態(視圖)。客戶端使用相同的工具來反序列化它。

+0

任何事情都可以反序列化(如果字節數組打印正確),它只需要一個自定義分析器 –

+0

@ cricket_007我不這麼認爲。只有真正的序列化對象才能被反序列化。任何事物都不能被反序列化。 – ruslanys

+0

一致格式化的字符串可以反序列化;) –

0

在您的案例中使用toString()會生成HashMap的字符串表示並通過網絡發送,而不是實際的HashMap,這就是您在Web應用程序端看到該表示的原因。

您應該使用ObjectOutputStream/ObjectInputStream類來發送/接收您的HashMap

ObjectOutputStream/ObjectInputStream特別關注跨網絡發送對象。

但是這需要要通過 網絡發送(這一過程被稱爲序列化)的所有對象必須實現Serializable接口,這是一個標記接口。