Java中将{"result":true,"eId":"xxx"}键值对数据转化为Map
问题描述:Java中从Buffer里面读取的数据格式为{"result":true,"eId":"xxx"},想读取eId对应的值,所以想着把这类数据转化为Map<String,String>类型的对象,会好取值一些。
推荐字符串处理包:Google guava工具类的介绍和使用
探索过程:
1、想着应该提简单的,不就是JSON数据转Map?觉得网上会有很多现成的。有些推荐使用JSON或者Gson转化的,但是我尝试之后发现都无法实现转化,原因大概是因为希望转化的数据格式并不符合Java中的JSON数据格式(如下图所示,参考链接http://www.51gjie.com/java/750.html)。
//定义JSON字符串
String JsonStr = "{\"id\": 2," +
" \"title\": \"json title\", " +
"\"config\": {" +
"\"width\": 34," +
"\"height\": 35," +
"}, \"data\": [" +
"\"JAVA\", \"JavaScript\", \"PHP\"" +
"]}"
2、网上还有另一种答案就是使用Google的Guava库,里面有很多字符串处理和转化的方法。
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1-jre</version>
</dependency>
在pom.xml添加如上maven依赖,其他方式可以可以自行百度。
使用指南可以参考:https://www.cnblogs.com/fleekfan/p/11572232.html。
下面附上我的部分代码片段:
String output = "";
String output1 = "";
System.out.println("Output from Server: ");
// 处理了一上午,小丑竟是我自己,为什么下面这种方法读取到的output在while循环之后是空的呢?
while ((output = responseBuffer.readLine()) != null) {
//跳出while后output为空,因为跳出循环的条件就是output为空,所以需要定义另外output1提前接收。
//因为这个原因,我试了半天JSON、GSON和guava都不行。。。。。。,还一直没注意到是这里的问题
output1 = output.substring(1,output.length()-1);
output = output;
System.out.println(output);
}
System.out.println("-------------"+output1);
output1 = output1.replace("\"",""); //去除掉键值对数据中多余的双引号,不然“eId”整//体才是key,去掉以后eid就是key了
System.out.println("去除双引号的"+output1);
Map<String,String> response = new HashMap<>();
//下面这个就是guava
response = Splitter.on(",").withKeyValueSeparator(":").split(output1);
System.out.println("===="+response);
System.out.println("===="+response.get("eId"));
哎,也是无语,中途一直没有意识到output的问题,以为别人给的方法不行。所以就是再不济,还有最简陋的方式,就是自己使用split函数来提取eId对应的值,如下代码所示。还是要注意对字符串的处理,包括去掉量变的括号{},以及多余的双引号等“”。
String[] res = output1.split(",");
String success = res[0].split(":")[1];
if(success.equals("false")){
map.put("reason","人脸识别失败");
}
else{
eId = res[1].split(":")[1];
System.out.println("获取的结果"+eId);
}