◉◡◉ 您好,欢迎到访伊成个人站!

不寻常的String To Map的转换

本文于1773天之前发表,文中内容可能已经过时。

“ElasticSearch-实战代码3”

前言

在一般的情况下,Java中字符串转Map需要确定一点,待转的字符串是不是json格式的,如果是json格式的则容易处理的多了,直接用Gson 或是 FastJSON 等就可以处理了。

正文

那另外一种情况如果需要转的字符串 不是 json 格式的那怎么办呢?
举个例子,需要转的字符串是以下这种:

1
id:1|age:27|name:test|sex:1

以上这样的字符串,那就需要你使用 String中的 split 方法进行分割,然后变成Map既可!

在说一种情况,由于工作里面碰见的特此也记录一下!
我遇到的需要把字符串转Map的字符串是这样的格式:

1
{id=1,age=2,name=test}

但是有一种特殊的情况,可能里面的一些字段没有值,最后可能需要处理的字符串则变成了这样:

1
{id=1,age=,name=}

那这样的情况怎么做呢?

网上大多数给出的代码的是以下这样的:

1
2
3
4
5
6
7
String str = "{id=1,age=,name=test}";
String[] strs = str.split("=");
Map<String, String> m = new HashMap<String, String>();
for(String s:strs){
String[] ms = s.split(":");
m.put(ms[0], ms[1]);
}

思路是对的,可是面对这样 key=value 且 value 可能没有值得情况,代码是用不了的。原因是就是
在分割字符串之后,给map 复制的那句 m.put(ms[0], ms[1]) 这里 ms[1] ,如果分割出来的字段是 age= 没有value 的 那么 ms[1] ,就会报一个 异常,数组越界异常。

根据以上代码则需要做一个特殊的处理,在给map 复制的时候需要判断一下被分割出来的 String[] ms = s.split(“:”); ms 里面有几个元素, 然后根据元素的最大下标去判断。

直接看 特殊处理后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private static Map<String,Object> getStringToMap(String str){
if (str.startsWith("{")) {
str = str.substring(1, str.length());
}
if (str.endsWith("}")) {
str = str.substring(0, str.length() - 1);
}

//根据逗号截取字符串数组
String[] str1 = str.split(",");
//创建Map对象
Map<String,Object> map = new HashMap<>();
//循环加入map集合
for (int i = 0; i < str1.length; i++) {
//根据":"截取字符串数组
String[] str2 = str1[i].split("=");
//str2[0]为KEY,str2[1]为值
// str2.length-1 为下标最大值
if(str2.length-1 == 0){
map.put(str2[0].trim(),"");
}else{
map.put(str2[0].trim(),str2[1].trim());
}

}
return map;
}

以上代码,就可以 适用于字符串里面的key和value都存在或是key有而value没有值的场景!如下两种字符串实例:

1
{id=1,age=,name=test}

1
{id=1,age=27,name=test}

写到这里,你也许看明白了这个不寻常的字符串就是,value可能没有值的时候转Map的特殊处理,原理就是在给Map赋值的时候使用分割后获取的String []数组的最大下标作文章,从而判断value是否有值,有值的时候取两个元素,没有则给个默认的空字符串。

支付宝打赏 微信打赏