Вам необходимо использовать Object
в качестве значения Map
, поскольку это может быть другое значение Map
, List
или primitive
(String
, Integer
и т. Д.). Jackson
позволяет также манипулировать JSON
с использованием типов JsonNode
. Нам нужно пройти JSON object
, а также JSON array
(вы забыли об этом). В этом случае нам необходимо:
JSON
- JsonNode
. JsonNode
API
. Map
Простая реализация:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class JsonApp {
public static void main(String[] args) throws Exception {
String json = "{\"Key1\": \"value1\", \"Key2\": { \"Key2.1\": \"value2.1\" }, \"Key3\":[{\"pRiMe\":11}]}";
Map<String, Object> map = convertJsonStringToMap(json);
System.out.println(map);
}
private static Map<String, Object> convertJsonStringToMap(String json) throws IOException {
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);
transformKeys(node);
TypeReference mapType = new TypeReference<Map<String, Object>>() {
};
return mapper.convertValue(node, mapType);
}
private static void transformKeys(JsonNode parent) {
if (parent.isObject()) {
ObjectNode node = (ObjectNode) parent;
List<String> names = new ArrayList<>();
node.fieldNames().forEachRemaining(names::add);
names.forEach(name -> {
JsonNode item = node.remove(name);
transformKeys(item);
node.replace(name.toLowerCase(), item);
});
} else if (parent.isArray()) {
ArrayNode array = (ArrayNode) parent;
array.elements().forEachRemaining(JsonApp::transformKeys);
}
}
}
Выше кода печатается:
{key1=value1, key2={key2.1=value2.1}, key3=[{prime=11}]}
Мы избавились от небезопасного литья и наша реализация более краткая.
Я не думаю, что это связано с тем, что сами языки являются «визуальными».
Из статьи в Википедии :
Термин «визуальный» обозначает отношения бренда с другими Microsoft языки программирования, такие как Visual Basic, Visual FoxPro, Visual J # и Visual C ++. Все эти продукты имеют графическую среду IDE и поддерживают быструю разработку приложений для Windows.
Я полагаю, что все происходит от какого-то события или выбора названия продукта. А теперь это как раз о бренде.
Я имею в виду, что в наше время вы даже не можете думать о какой-то IDE, называемой Studio
, и то же самое можно сказать, например, о Visual Eclipse
.
Я подозреваю, что все это восходит к исходному Visual Basic . «Визуальной» частью этого был дизайнер пользовательского интерфейса ...
Генератор интерфейса Ruby предоставил «визуальную» часть Visual Basic
Эти языки не называются "Визуальными". Продукция "Визуальная".
Это еще до появления .NET. "Visual" Basic был "Visual" из-за графического интерфейса для разработки форм. «Визуальный» C ++ был «визуальным» из-за MFC и мастеров для создания приложения MFC.
Думаю, это в основном маркетинговый выбор.
Однако это могло быть связано с тем фактом, что «Visual Studio» - это графический интерфейс, таким образом, способ «визуализировать» ваш код.
Использование слова "Visual" стало популярным с выходом Visual C++ версии 1.0; это была первая версия, которая работала в Windows, в то время как другие версии работали в режиме DOS, хотя и могли создавать код, запускаемый под Windows. Это не имеет никакого отношения к языкам, скорее к среде, в которой работает IDE.