В Java 8 я хочу преобразовать строку JSON в карту и применить «сложные» преобразования к ключам. В качестве примера это "сложное" преобразование будет просто преобразованием в нижнем регистре.Значения во входном JSON могут быть строками или вложенными объектами JSON.Мой код на самом деле работает, но я пытаюсь исправить предупреждение unchecked cast
.
Пример
Пример ввода JSON (String
):
{
"Key1": "value1",
"Key2": {
"Key2.1": "value2.1"
}
}
Требуемый вывод(Map
):
"key1" -> "value1"
"key2" ->
"key2.1" -> "value2.1"
1.JSON String -> Map
Для этой части я использовал Джексона (2.9.8) и определил следующую функцию:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
Map<String, Object> convertJsonStringToMap(String json) throws IOException {
ObjectMapper mapper = new ObjectMapper();
TypeReference type = new TypeReference<Map<String, Object>>(){};
return mapper.readValue(json, type);
}
Поскольку значения могут быть строками или объектами JSON, тип возвращаемого значенияэтой функции Map<String, Object>
.Также обратите внимание, что readValue
(в классе ObjectMapper
) использует дженерики, его подпись:
<T> T readValue(String content, TypeReference valueTypeRef)
2.Карта -> Карта с преобразованными ключами (пример: строчные буквы)
Я определил следующую функцию:
Map<String, Object> transformKeys(Map<String, Object> map) {
Map<String, Object> result = new HashMap<>(map.size());
for (Map.Entry<String, Object> entry : map.entrySet()) {
Object value = entry.getValue();
if (value instanceof Map) {
value = transformKeys((Map<String, Object>) value);
}
// toLowerCase() is the transformation here (example), but I could have used something else
result.put(entry.getKey().toLowerCase(), value);
}
return result;
}
Для обработки вложенных карт эта функция является рекурсивной.Но так как в качестве параметра требуется Map<String, Object>
, я должен привести value
к Map<String, Object>
для рекурсивного вызова метода.
3.Собирая все вместе
String json = "{\"Key1\": \"value1\", \"Key2\": { \"Key2.1\": \"value2.1\" }}";
Map<String, Object> initialMap = convertJsonStringToMap(json);
Map transformedMap = transformKeys(initialMap);
System.out.println(transformedMap);
Этот код работает и печатает, как и ожидалось:
{key1 = value1, key2 = {key2.1 = value2.1}}
Но эта строка в функции transformKeys
:
value = transformKeys((Map<String, Object>) value);
выдает предупреждение:
[WARNING] App.java:[29,74] unchecked cast
required: java.util.Map<java.lang.String,java.lang.Object>
found: java.lang.Object
Предупреждение ясно, и я его понимаю (компилятор не можетзнаете, если value
действительно является экземпляром Map<String, Object>
), но есть ли способ от него избавиться?
(№ @SuppressWarnings
, пожалуйста, ни -Xlint:none
): D
Мне кажется, что возвращать Map<String, Object>
из convertJsonStringToMap
не самый чистый способ конвертировать строку JSON в карту, но я не могу найти другой способ сделать это с Джексоном.