Преобразование JSON в хэш-карту с помощью Jackson- Java

#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}]