#java #json #jackson
#java #json #джексон
Вопрос:
Прежде чем это будет помечено как дубликат, пожалуйста, прочитайте вопрос (я просмотрел похожие). Спасибо.
Для простоты предположим, что у меня есть JSON, подобный этому:
{
"clients" : [
{
"name" : "client 1",
"id" : 1
},
{
"name" : "client 2",
"id" : 2
}
],
"other" : {
"something" : ""
}
...
}
Итак, я хочу создать хэш-карту только для клиентов и их полей. Основной вопрос заключается в том, как бы я мог это сделать, используя методы Jackson для одного массива JSON, такого как клиенты? Я пытался посмотреть онлайн, но все примеры, которые я видел, либо не используют Jackson, либо предназначены только для одного объекта JSON, вот так:
HashMap<String, String>[] values = new ObjectMapper().readValue(jsonString, new TypeReference<HashMap<String, String>[]>() {});
Я также видел примеры Gson, и я знаю, что могу использовать магию синтаксического анализа строк:
jsonSting = jsonString.substring(jsonString.indexOf("["), (jsonString.indexOf("]") 1))
чтобы получить его в формате, который я могу использовать, но я хочу попробовать его с Jackson, чтобы избежать импорта другой библиотеки. Есть идеи?
Перефразируя вопрос: итак, если бы у меня был только список клиентов, подобных so:
jsonString = [{"name" : "client 1","id" : 1},{"name" : "client 2","id" : 2}]
тогда я мог бы просто сделать:
HashMap[] values = new ObjectMapper().readValue(jsonString, new TypeReference[]>() {});
чтобы получить то, что я хочу. Я в основном спрашиваю, есть ли способ, используя методы Джексона, получить jsonString выше из большого раздела JSON сверху. Я знаю, что могу легко сделать это с помощью этого примера с разбором строк, но в будущем будут более сложные ситуации, и разбор строк на самом деле не считается лучшей практикой
Комментарии:
1. Пожалуйста, опишите целевую хэш-карту. Каковы его ключи? Каковы его значения?
2. у вас есть API, найдите пример, попробуйте
3. Это массив хэш-карт, поэтому у каждого клиента будет своя карта (ее имеет смысл использовать для большего набора данных). Таким образом, для первого клиента ключами будут name и id, а значениями будут «клиент 1» и 1
4. Итак, вам нужен массив хэш-карт?
5. Это немного сложно, мне это понадобится для других частей большого проекта, чтобы сравнивать результаты с запросами к базе данных и отслеживать, сколько клиентов существует.
Ответ №1:
Вы можете извлечь часть дерева JSON с помощью API-интерфейса Jackson tree model, а затем преобразовать его в массив карт.
Вот пример:
public class JacksonReadPart {
public static final String JSON = "{n"
" "clients" : [n"
" {n"
" "name" : "client 1",n"
" "id" : 1n"
" },n"
" {n"
" "name" : "client 2",n"
" "id" : 2n"
" }n"
"],n"
" "other" : {n"
" "something" : ""n"
" }n"
"n"
"}";
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(JSON).path("clients");
// non type safe
Map<String, Object>[] clients = mapper.treeToValue(node, Map[].class);
System.out.println(Arrays.toString(clients));
// type safe
JsonParser parser = mapper.treeAsTokens(node);
clients = parser.readValueAs(new TypeReference<Map<String, Object>[]>() {});
System.out.println(Arrays.toString(clients));
}
}
Вывод:
[{name=client 1, id=1}, {name=client 2, id=2}]
[{name=client 1, id=1}, {name=client 2, id=2}]