Как бороться с ошибкой "не может быть преобразован в класс" - GSON JAVA - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь записать свой список в jtable в абстрактной модели, а затем вернуть мне эту ошибку. На мой взгляд, это могло быть вызвано форматом списка? имя и сумма указаны не в том месте. Это мое полное сообщение об ошибке: Исключение в потоке "AWT-EventQueue-0" java .lang.ClassCastException: класс com.google.gson.internal.LinkedTreeMap не может быть преобразован в класс Model.Medicine (com.google.gson. internal.LinkedTreeMap и Model.Medicine находятся в безымянном модуле загрузчика app)

Вот код: Это мой класс медицины

public class Medicine {

private String name;
private String amount;

public Medicine( String amount, String name){
    this.name = name;
    this.amount = amount;
}

public String getName() {return name;}
public void setName(String name){this.name = name;}

public String getAmount(){return amount;}
public void setAmount(String amount){this.amount = amount;}
}

Это мой код преобразования:

public List<Medicine> FromJsonToArray() throws IOException {
    String medicineJson = initArray("Medicines.json").toString();
    Gson gson = new Gson();
    List<Medicine> medicineArray = gson.fromJson(medicineJson, List.class);
    return medicineArray;
    }

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

[{amount=123,name=Ibuprofen},{amount=333,name=Ketonal},...]

My json:

[
{
    "amount": "123",
    "name": "Ibuprofen"
},
{
    "amount": "333",
    "name": "Ketonal"
}
]

И, наконец, класс модели таблицы с ошибкой:

public class MedicineTableModel extends AbstractTableModel {
private List<Medicine> medicines;
private String[] columns;

public  MedicineTableModel(List<Medicine> aMedicineList){
    super();
    medicines = aMedicineList;
    columns = new String[]{"Name", "Amount"};
}


@Override
public int getRowCount() {
    return medicines.size();
}

@Override
public int getColumnCount() {

    return columns.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
    if (columnIndex<medicines.size())
    {
        Medicine c= medicines.get(rowIndex); <---- there is a problem :O
        if(rowIndex == 0) {

            return(c.getName());
        }
     }
    return null;
}
public String getColumnName(int col) {
    return columns[col] ;
}
}

1 Ответ

1 голос
/ 08 мая 2020
public List<Medicine> FromJsonToArray() throws IOException {
    String medicineJson = initArray("Medicines.json").toString();
    Gson gson = new Gson();
    Type medicineListType = new TypeToken<List<Medicine>>() {}.getType();
    List<Medicine> medicineArray = gson.fromJson(medicineJson, medicineListType);
    return medicineArray;
}

должно сработать.

В основном это обходной путь, чтобы указать gson десериализоваться в список определенного класса.

Это необходимо, потому что дженерики теряются во время выполнения и ваш json десериализовался в List<LinkedTreeMap> вместо List<Medicine>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...