如何在java中将String转换为Hashmap

问题描述 投票:0回答:9

如何将

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
的东西。

我正在寻找一种通用方法。

java collections hashmap
9个回答
67
投票

这是一种解决方案。如果你想让它更通用,你可以使用

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
包中。


11
投票

只需一行即可将任何类型的对象转换为任何其他类型的对象。

(因为我相当自由地使用Gson,所以我分享基于Gson的方法)

Gson gson = new Gson();    
Map<Object,Object> attributes = gson.fromJson(gson.toJson(value),Map.class);

它的作用是:

  1. gson.toJson(value)
    会将您的对象序列化为其等效的 Json 表示形式。
  2.  gson.fromJson
    将 Json 字符串转换为指定对象。 (在此示例中 -
    Map

这种方法有 2 个优点:

  1. 可以灵活地将任何对象而不是字符串传递给
    toJson
    方法。
  2. 您可以使用这一行来转换为任何对象,甚至是您自己声明的对象。

6
投票
String value = "{first_name = naresh,last_name = kumar,gender = male}"

我们开始吧

  1. {
    >> 中删除
    }
    String
    >>名字 = naresh,姓氏 = kumar,性别 = 男
  2. String
    ,
    >> 3 个元素的数组中拆分出来
  3. 现在你有了一个
    array
    3
    元素
  4. 迭代
    array
    并将每个元素按
    =
  5. 分割
  6. 创建一个
    Map<String,String>
    ,将每个部分用
    =
    分隔开。第一部分为
    Key
    ,第二部分为
    Value

0
投票
@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())));
}

0
投票

试试这个:)

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}}}


0
投票

应该使用这种方式转换成地图:

    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]);
  }

0
投票
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>

0
投票

令人惊讶的是没有人提到仅使用 JSONObject(org.json.JSONObject)

        JSONObject json = new JSONObject(mapStr);
        Map<String,Object> map = json.toMap();

比自己编写解析器好得多吗?


0
投票

使用 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()));
  1. Arrays.stream()
    将字符串数组转换为流。
  2. replaceAll("[{}]", " "):
    正则表达式版本替换两个大括号。
  3. split(","):
    将字符串拆分为 , 以获得单独的地图条目。
  4. s.split("=", 2):
    用 = 拆分它们以获取键和值,并确保数组永远不会大于两个元素。
  5. Stream API 中的
    collect()
    方法从流对象中收集所有对象并存储在集合类型中。
  6. Collectors.toMap(s -> s[0].trim(), s -> s[1].trim()):
    将元素累积到 Map 中,其键和值是将提供的映射函数应用于输入元素的结果。
© www.soinside.com 2019 - 2024. All rights reserved.