Перейти к содержимому

Организация автоматизированного тестирования
онлайн, начало 10 июля
Автоматизатор мобильных приложений
онлайн, начало 8 июля
Тестирование безопасности
онлайн, начало 8 июля
Автоматизация тестов для REST API при помощи Postman
онлайн, начало 9 июля
Фотография

Конвертация JSON в HashMap (язык Java)


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 Dmitry2017

Dmitry2017

    Новый участник

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Дмитрий Витальевич


Отправлено 15 октября 2019 - 17:04

Коллеги, приветствую!

Проблема в следующем. Имеется конфиг в формате JSON.

Задача десериализовать конфиг-параметры и использовать их в автотестах.

JSON при этом такой:

{
  "AU": {
    "login": "Anisimov",
    "password": "ZTd9Pn"
  },
  "OTUR": {
    "login": "interfax_ot_ur",
    "password": "123456"
  }
}

Код, которым пытаюсь решить задачу (с помощью jackson) такой:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.*;
import java.util.*;

public class MyHashMapJsonTest {

public static void main(String[] args) throws IOException {

  BufferedReader reader = new BufferedReader(new FileReader(new File("config/config2.json")));
  HashMap<String, List<String>> result = new ObjectMapper().readValue(reader, HashMap.class);
   
  List<String> currentRole = (List<String>) result.get("AU");
  System.out.println(currentRole); 

На предпоследней строке код падает с исключением  Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.util.List

Как думаете, что здесь не так?


  • 0

#2 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 821 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 16 октября 2019 - 07:17

Зачем тебе вообще HashMap ? 

 

 

1. Как я помню должно быть [ и ] для джcона

 

[
  {
    "AU": {
      "login": "Anisimov",
      "password": "ZTd9Pn"
    },
    "OTUR": {
      "login": "interfax_ot_ur",
      "password": "123456"
    }
  }
]
 
2. Во-вторых ты должен сделать класс User
ObjectMapper objectMapper = new ObjectMapper();
List<User> users = objectMapper.readValue(new File("config2.json"), new TypeReference<List<User>>(){});
и получить обычную коллекцию с логинами и паролем

  • 0

#3 Little_CJIOH

Little_CJIOH

    Гуру

  • Members
  • PipPipPipPipPipPip
  • 1 480 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 16 октября 2019 - 10:20

Коллеги, приветствую!
Проблема в следующем. Имеется конфиг в формате JSON.
Задача десериализовать конфиг-параметры и использовать их в автотестах.
JSON при этом такой:

{
  "AU": {
    "login": "Anisimov",
    "password": "ZTd9Pn"
  },
  "OTUR": {
    "login": "interfax_ot_ur",
    "password": "123456"
  }
}
Код, которым пытаюсь решить задачу (с помощью jackson) такой:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.*;
import java.util.*;

public class MyHashMapJsonTest {

public static void main(String[] args) throws IOException {

  BufferedReader reader = new BufferedReader(new FileReader(new File("config/config2.json")));
  HashMap<String, List<String>> result = new ObjectMapper().readValue(reader, HashMap.class);
   
  List<String> currentRole = (List<String>) result.get("AU");
  System.out.println(currentRole); 
На предпоследней строке код падает с исключением  Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.util.List
Как думаете, что здесь не так?

Поставь брекпоинт на предпоследней строке и посмотри структуру объекта result. заэвалуейть get и посмотри что вернется.
Ну и более простой подход - создать объект конфигурация создавать его из  jsona и уже из него геттерами брать значения.
 

1. Как я помню должно быть [ и ] для джcона

там не массив, так что все ок.
  • 0

#4 Dmitry2017

Dmitry2017

    Новый участник

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Дмитрий Витальевич


Отправлено 16 октября 2019 - 10:26

 

Зачем тебе вообще HashMap ? 

 

Идея с HashMap заключается в работе с двухуровневой структурой в JSON. Типа "ключ - значение".

Из командной строки запуска теста хочу передавать тип User'a (например, "AU"). Далее по ключу "AU" получать его логин и пароль.

Насколько я понимаю List<Userбудет работать с одноуровневой структурой.

Но я попытался преобразовать JSON в одноуровневую:

[
  {
    "name": "AU",
    "login": "Anisimov",
    "password": "ZTd9Pn"
  },
  {
  "name": "OTUR",
  "login": "interfax_ot_ur",
  "password": "123456"
  }
]

При этом да - сделал класс User:

public class User {
  private final String name;
  private final String login;
  private final String password;

  public User(String name,String login, String password) {
    this.name = name;
    this.login = login;
    this.password = password;
  }

  public String getName() {
    return name;
  }

  public String getLogin() {
    return login;
  }

  public String getPassword() {
    return password;
  }
}

и вставил предлагаемый тобой код:

ObjectMapper objectMapper = new ObjectMapper();
List<User> users = objectMapper.readValue(new File("config3.json"), new TypeReference<List<User>>(){});

Теперь при запуске получаю исключение: Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `ru.qa.test.bankrot.model.User` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

Опять чего то не так :(


  • 0

#5 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 821 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 16 октября 2019 - 10:41

Все так, только убери final - это не надо и добавь пустой конструктор 

public User() {

}

Ну и для красивого вывода toString переопредели

Проверил у себя - работает

[User{name='AU', login='Anisimov', password='ZTd9Pn'}, User{name='OTUR', login='interfax_ot_ur', password='123456'}]


  • 0

#6 Dmitry2017

Dmitry2017

    Новый участник

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Дмитрий Витальевич


Отправлено 19 октября 2019 - 10:54

Все так, только убери final - это не надо и добавь пустой конструктор 

public User() {

}

Ну и для красивого вывода toString переопредели

Проверил у себя - работает

[User{name='AU', login='Anisimov', password='ZTd9Pn'}, User{name='OTUR', login='interfax_ot_ur', password='123456'}]

 

Огромное спасибо за советы! Все заработало! И даже с более сложным JSON с двухуровневой структурой.


  • 0


Программирование на С# для тестировщиков
онлайн
Автоматизатор мобильных приложений
онлайн
Selenium WebDriver: полное руководство
онлайн
Программирование на Python для тестировщиков
онлайн



Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Яндекс.Метрика
Реклама на портале