如何将
String
转换为 HashMap
?
String value = "{first_name = naresh, last_name = kumar, gender = male}"
进入
Map<Object, Object> = {
first_name = naresh,
last_name = kumar,
gender = male
}
其中键为
first_name
、last_name
和 gender
,值为 naresh
、kumar
、male
。
注意: 键可以是任何类似
city = hyderabad
的东西。
我正在寻找一种通用方法。
这是一种解决方案。如果你想让它更通用,你可以使用
StringUtils
库。
String value = "{first_name = naresh,last_name = kumar,gender = male}";
value = value.substring(1, value.length()-1); //remove curly brackets
String[] keyValuePairs = value.split(","); //split the string to creat key-value pairs
Map<String,String> map = new HashMap<>();
for(String pair : keyValuePairs) //iterate over the pairs
{
String[] entry = pair.split("="); //split the pairs to get key and value
map.put(entry[0].trim(), entry[1].trim()); //add them to the hashmap and trim whitespaces
}
例如您可以切换
value = value.substring(1, value.length()-1);
到
value = StringUtils.substringBetween(value, "{", "}");
如果您使用的是
StringUtils
,它包含在apache.commons.lang
包中。
(因为我相当自由地使用Gson,所以我分享基于Gson的方法)
Gson gson = new Gson();
Map<Object,Object> attributes = gson.fromJson(gson.toJson(value),Map.class);
它的作用是:
gson.toJson(value)
会将您的对象序列化为其等效的 Json 表示形式。 gson.fromJson
将 Json 字符串转换为指定对象。 (在此示例中 - Map
)这种方法有 2 个优点:
toJson
方法。String value = "{first_name = naresh,last_name = kumar,gender = male}"
我们开始吧
{
>> 中删除 }
和 String
>>名字 = naresh,姓氏 = kumar,性别 = 男String
从 ,
>> 3 个元素的数组中拆分出来array
和 3
元素array
并将每个元素按 =
Map<String,String>
,将每个部分用 =
分隔开。第一部分为 Key
,第二部分为 Value
@Test
public void testToStringToMap() {
Map<String,String> expected = new HashMap<>();
expected.put("first_name", "naresh");
expected.put("last_name", "kumar");
expected.put("gender", "male");
String mapString = expected.toString();
Map<String, String> actual = Arrays.stream(mapString.replace("{", "").replace("}", "").split(","))
.map(arrayData-> arrayData.split("="))
.collect(Collectors.toMap(d-> ((String)d[0]).trim(), d-> (String)d[1]));
expected.entrySet().stream().forEach(e->assertTrue(actual.get(e.getKey()).equals(e.getValue())));
}
试试这个:)
public static HashMap HashMapFrom(String s){
HashMap base = new HashMap(); //result
int dismiss = 0; //dismiss tracker
StringBuilder tmpVal = new StringBuilder(); //each val holder
StringBuilder tmpKey = new StringBuilder(); //each key holder
for (String next:s.split("")){ //each of vale
if(dismiss==0){ //if not writing value
if (next.equals("=")) //start writing value
dismiss=1; //update tracker
else
tmpKey.append(next); //writing key
} else {
if (next.equals("{")) //if it's value so need to dismiss
dismiss++;
else if (next.equals("}")) //value closed so need to focus
dismiss--;
else if (next.equals(",") //declaration ends
&& dismiss==1) {
//by the way you have to create something to correct the type
Object ObjVal = object.valueOf(tmpVal.toString()); //correct the type of object
base.put(tmpKey.toString(),ObjVal);//declaring
tmpKey = new StringBuilder();
tmpVal = new StringBuilder();
dismiss--;
continue; //next :)
}
tmpVal.append(next); //writing value
}
}
Object objVal = object.valueOf(tmpVal.toString()); //same as here
base.put(tmpKey.toString(), objVal); //leftovers
return base;
}
示例 输入:“a=0,b={a=1},c={ew={qw=2}},0=a” 输出:{0=a,a=0,b={a=1},c={ew={qw=2}}}
应该使用这种方式转换成地图:
String student[] = students.split("\\{|}");
String id_name[] = student[1].split(",");
Map<String,String> studentIdName = new HashMap<>();
for (String std: id_name) {
String str[] = std.split("=");
studentIdName.put(str[0],str[1]);
}
You can use below library to convert any string to Map object.
<!-- https://mvnrepository.com/artifact/io.github.githubshah/gsonExtension -->
<dependency>
<groupId>io.github.githubshah</groupId>
<artifactId>gsonExtension</artifactId>
<version>4.1.0</version>
</dependency>
令人惊讶的是没有人提到仅使用 JSONObject(org.json.JSONObject)
JSONObject json = new JSONObject(mapStr);
Map<String,Object> map = json.toMap();
比自己编写解析器好得多吗?
使用 Java 8 流:
Map<String, String> map = Arrays.stream(value.replaceAll("[{}]", " ").split(","))
.map(s -> s.split("=", 2))
.collect(Collectors.toMap(s -> s[0].trim(), s -> s[1].trim()));
Arrays.stream()
将字符串数组转换为流。replaceAll("[{}]", " "):
正则表达式版本替换两个大括号。split(","):
将字符串拆分为 , 以获得单独的地图条目。s.split("=", 2):
用 = 拆分它们以获取键和值,并确保数组永远不会大于两个元素。collect()
方法从流对象中收集所有对象并存储在集合类型中。Collectors.toMap(s -> s[0].trim(), s -> s[1].trim()):
将元素累积到 Map 中,其键和值是将提供的映射函数应用于输入元素的结果。