Java 使用URLConnection发送和检索映射
我想将HashMap从Swing应用程序发送到Web应用程序。HashMap类型为。它包含一个字符串、ArrayList和字节数组。我想在web应用程序中检索此地图 回转侧代码:Java 使用URLConnection发送和检索映射,java,Java,我想将HashMap从Swing应用程序发送到Web应用程序。HashMap类型为。它包含一个字符串、ArrayList和字节数组。我想在web应用程序中检索此地图 回转侧代码: private static void sendMap() { System.out.println("Sending MAP"); byte[] bytes=getByteArray(); ArrayList<String> list =new Ar
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();
}
}
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();
}
}
输出:
缓冲区==={Type=归档,PartyNameList=[ABC,XYZ,ABXY],字节=[B@24c0f1ec}
如何从该缓冲区获取映射对象。或者是否有其他解决方案来实现此目的。请提前感谢。您正在使用的只是
toString()
方法。无法从该方法进行反序列化。
使用JSON或Java序列化工具将映射移动到可转移状态(视图)。在客户端使用相同的工具对其进行反序列化。使用toString()
在您的例子中,生成HashMap的字符串表示并通过网络发送它,而不是实际的HashMap
,这就是为什么您在Web应用程序端看到该表示
您应该使用ObjectOutputStream/ObjectInputStream
类来发送/接收您的HashMap
ObjectOutputStream/ObjectInputStream
专门负责通过网络发送对象
但是,这要求您要通过网络发送的所有对象
网络(此过程称为序列化)必须实现可序列化接口,该接口是一个标记接口。我的问题使用JSON解决 回转侧代码:
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();
}
}
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();
}
}
private static void sendMap()
{
System.out.println(“发送地图”);
ArrayList=新建ArrayList();
列表。添加(“ABC”);
列表。添加(“XYZ”);
列表。添加(“ABXY”);
Map params=新的HashMap();
参数put(“类型”、“文件”);
参数put(“字节”,getByteArray());
参数put(“名称列表”,列表);
试一试{
URL=新URL(iLinkitUrl+“/getMap?id=1234567”);
URLConnection uc=url.openConnection();
uc.设置输出(真);
uc.setDoInput(真);
uc.setAllowUserInteraction(假);
DataOutputStream数据流=新的DataOutputStream(uc.getOutputStream());
write(新的com.google.gson.gson().toJson(params.getBytes());
dstream.close();
InputStream in=uc.getInputStream();
int x;
而((x=in.read())!=-1){
系统输出写入(x);
}
in.close();
BufferedReader r=新的BufferedReader(新的InputStreamReader(in));
StringBuffer buf=新的StringBuffer();
弦线;
而((line=r.readLine())!=null){
buf.追加(行);
}
}捕获(异常)
{
异常。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());
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;
}
InputStream in=request.getInputStream();
BufferedReader r=新的BufferedReader(新的InputStreamReader(in));
StringBuffer buf=新的StringBuffer();
弦线;
而((line=r.readLine())!=null){
buf.追加(行);
}
Map Map=convertJsonToMap(buf.toString());
私有映射转换JSONTOMAP(字符串json){
Map Map=newhashmap();
ObjectMapper mapper=新的ObjectMapper();
试一试{
//将JSON字符串转换为映射
map=mapper.readValue(json,newTypeReference(){});
}捕获(例外e){
e、 printStackTrace();
}
返回图;
}
查看XML或JSON符号,以及在Java中生成和使用它们的API…使用Arrays.toString修复字节数组通常项目会在某些框架上增长。几乎所有项目都有编码/解码参数的概念。任何东西都可以反序列化(如果字节数组打印正确),它只需要一个自定义parser@cricket_007我不这么认为。只有真正序列化的对象才能被反序列化。任何东西都不能被反序列化。格式一致的字符串可以被反序列化;@cricket_007格式一致的字符串已经被真正序列化:)我想我的意思是说刚刚被解析,然后