Преобразование JSON строки в HashMap в Java: org.json
Быстрый ответ
Для преобразования JSON-строки в HashMap
можно воспользоваться ObjectMapper
из библиотеки Jackson:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
String json = "{\"key1\":\"value1\",\"key2\":2}";
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> result = mapper.readValue(json, Map.class);
Этот код быстро конвертирует JSON-строку в Map
, где ключи – это строки, а значения – объекты.
Работа с вложенными JSON
Если встречаются вложенные JSON-структуры, можно применить следующий подход:
import org.json.JSONObject;
import java.util.Map;
String nestedJson = "{\"name\":\"John\", \"contact\":{\"email\":\"john.doe@example.com\", \"phone\":\"1234567890\"}}";
JSONObject jsonObject = new JSONObject(nestedJson);
Map<String, Object> result = jsonObject.toMap();
В качестве альтернативы применимы инструменты типа ObjectMapper
из Jackson или Gson
от Google:
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.HashMap;
Gson gson = new Gson();
Type type = new TypeToken<HashMap<String, Object>>(){}.getType();
HashMap<String, Object> result = gson.fromJson(nestedJson, type);
Использование рекурсии для сохранения типов данных
Применив рекурсию, можно сохранить типы данных в HashMap:
private static Map<String, Object> parseJSONObject(JSONObject json) {
Map<String, Object> resultMap = new HashMap<>();
json.keys().forEachRemaining(key -> {
Object value = json.get(key);
resultMap.put(key, value instanceof JSONObject ? parseJSONObject((JSONObject) value) :
value instanceof JSONArray ? parseJSONArray((JSONArray) value) : value);
});
return resultMap;
}
private static List<Object> parseJSONArray(JSONArray array) {
List<Object> resultList = new ArrayList<>();
for (int i = 0; i < array.length(); i++) {
Object item = array.get(i);
resultList.add(item instanceof JSONObject ? parseJSONObject((JSONObject) item) :
item instanceof JSONArray ? parseJSONArray((JSONArray) item) : item);
}
return resultList;
}
Обработка ошибок для устойчивости
Добавьте обработку исключений для устойчивости программы:
try {
Map<String, Object> result = mapper.readValue(json, Map.class);
} catch (IOException e) {
e.printStackTrace();
}
Визуализация
JSON-строка воспринимается как комод с ящиками, где каждый ключ открывает значение:
HashMap<String, Integer> fruitDrawer = new HashMap<>();
fruitDrawer.put("apple", 5);
fruitDrawer.put("banana", 3);
fruitDrawer.put("cherry", 7);
Каждый ключ в HashMap работает как пароль для доступа к содержимому ящика.
Использование JSR 353 для стандартизованной обработки
Для стандартизованных процедур обработки JSON в Java используйте JSR 353
:
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import java.io.StringReader;
import java.util.Map;
String json = "{\"key1\":\"value1\",\"key2\":2}";
JsonReader jsonReader = Json.createReader(new StringReader(json));
JsonObject jsonObject = jsonReader.readObject();
Map<String, Object> result = jsonObject;
Работа с массивами как профессионал
Воспользуйтесь ArrayList
для работы с JSON-массивами:
JSONArray jsonArray = new JSONArray("[\"John\", \"Jane\", \"Doe\"]");
List<String> list = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
list.add(jsonArray.getString(i));
}
myHashMap.put("names", list);
Погружение в документацию ради совершенства
Для достижения мастерства в преобразовании JSON в HashMap стоит проработать соответствующую документацию и примеры.
Полезные материалы
- GitHub – FasterXML/jackson: Официальная страница проекта Jackson
- java – Преобразование JSON-строки в HashMap – Stack Overflow: примеры и обсуждения по работе с Jackson.
- javax.json (Java(TM) EE 7 Specification APIs): руководство по JSON Processing (JSON-P).
- GitHub – fangyidong/json-simple: Набор инструментов для работы c JSON на Java
- Gson User Guide: Руководство по работе с JSON используя библиотеку Gson от Google