Как преобразовать String в Hashmap в java

Как я могу преобразовать 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.

Я ищу общий подход.

Ответ 1

Это одно решение. Если вы хотите сделать его более общим, вы можете 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);

to

 value = StringUtils.substringBetween(value, "{", "}");

если вы используете StringUtils, который содержится в пакете apache.commons.lang.

Ответ 2

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

Пусть начнется

  • Удалите { и } из String → first_name = naresh, last_name = kumar, gender = male
  • Разделите String из , → массив из 3 элементов
  • Теперь у вас есть array с элементом 3
  • Итерации array и разбиение каждого элемента на =
  • Создайте Map<String,String> поместите каждую часть, разделенную =. первая часть как Key и вторая часть как Value

Ответ 3

Поскольку я использую Gson довольно свободно, я могу поделиться подходом на основе Gson:

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

Что это делает:

  1. gson.toJson(value) сериализует ваш объект в его эквивалентное представление Json.
  2. gson.fromJson преобразует строку Json в указанный объект. (в этом примере - Map)

Гибкость этого подхода заключается в том, что вы можете передавать объект вместо String в метод toJson.

Ответ 4

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

Ответ 5

попробуйте это :)

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 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}, с = {EW = {QW = 2}}}