Как преобразовать 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);
Что это делает:
-
gson.toJson(value)
сериализует ваш объект в его эквивалентное представление Json. -
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}}}