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

Практикум по тест-дизайну 2.0
онлайн, начало 29 ноября
Тестирование мобильных приложений
онлайн, начало 27 ноября
Автоматизатор мобильных приложений
онлайн, начало 27 ноября
Программирование на Python для тестировщиков
онлайн, начало 22 ноября
Фотография

Конвертация 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
  • 795 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 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 430 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 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
  • 795 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 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 анонимных

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