Исключение в основном java.lang.ClassCastException: класс java.lang.String не может быть приведен к классу

Я получаю clasCastException при обработке данных json.

Я хочу получить «employeeid» из ответа JSON и хочу позже записать идентификаторы сотрудников в новый файл Excel. Однако я получаю исключение приведения класса - String не может быть преобразован в объект.

Я вставил свой код ниже, так как я новичок в этом, поэтому ваша помощь будет очень признательна.

вот мой ответ JSON:


{
    "msg": "Successful",
    "displaycount": "50",
    "totalcount": "1294",
    "userdetails": [
        {
            "employeeid": "132421",
            "userKey": 17
        },
        {
            "employeeid": "112342",
            "userKey": 18
        },
        {
            "employeeid": "112341",
            "userKey": 19
        },
        {
            "employeeid": "112343",
            "userKey": 20
        },
        {
            "employeeid": "99954",
            "userKey": 21
        },
    ],
    "errorCode": "0"
}

Код:

package api.src;

import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.opencsv.CSVWriter;
import java.io.*;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class callAPI {

     static String[] finalResult;
     public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException, ParseException {

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("*****"))
            .header("X-RapidAPI-Host", "***********")
            .header("Content-Type", "application/json")
            .header("Authorization",**********)
            .method("POST", HttpRequest.BodyPublishers.noBody())
            .build();

    System.out.println("Connected "+request);

    try {
        String path = "D:/Sonika/JARs/httpresponse.json";

        HttpResponse<String> response = null;
        response = HttpClient.newHttpClient().send(request, 
        HttpResponse.BodyHandlers.ofString());
        int statusCode = response.statusCode();
        System.out.println(statusCode);

        System.out.println(response.body());
        try (PrintWriter out = new PrintWriter(new FileWriter(path))) {
            out.write(response.body().toString());
        }

        JSONParser parse = new JSONParser();
        JSONObject jobj = (JSONObject) parse.parse(new FileReader(path));
        JSONArray jsonarr_1 = (JSONArray) jobj.get("userdetails");

        //Get data for userdetails array
        for (Object element : jsonarr_1) {
        //Store the JSON objects in an array
        //Get the index of the JSON object and print the values as per the index
        JSONObject jsonobj_1 = (JSONObject)element;
        finalResult =  (String[]) jsonobj_1.get("employeeid");
        System.out.println("\nEmployee ID: "+finalResult);

        }   
    }
    
    catch(IOException e) {
        // handle not expected exception
        e.printStackTrace();
    }
    }
    public void writingCSVFile(){
        try {
            CSVWriter  file = new CSVWriter(new FileWriter(new File("D:/Sonika/JARs/OutputExcelfile.xlsx")));
            String[] colName = { "Employee ID"};
            file.writeNext(colName);
            file.writeNext(finalResult);
            file.close();
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

Пожалуйста, прочтите stackoverflow.com/editing-help и отредактируйте свой пост, используя предварительный просмотр, чтобы убедиться, что он читаем перед публикацией.

Jon Skeet 13.04.2023 16:02

(Я также настоятельно рекомендую сократить это до минимального воспроизводимого примера — я был бы очень удивлен, если вам действительно нужно включить выборку из HTTP и анализ JSON и запись данных в файл CSV для одной ошибки.)

Jon Skeet 13.04.2023 16:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

хорошо, давайте сделаем это немного проще. Когда у вас есть jsonString, вы можете сделать что-то вроде этого:

List<String> employeeIds = new ArrayList<>();
JSONObject obj = new JSONObject(jsonString);
if (obj.has("userdetails")) {
// get the userDetails array object
 JSONArray userDetails = obj.getJSONArray("userdetails");

// loop over
 for (int i = 0; i < userDetails.length(); i++) {
    JSONObject object = (JSONObject) userDetails.get(i);
    employeeIds.add(object.getString("employeeid"))

  }

}

Позже вы можете записать список сотрудников в любой файл, который вы хотите.

ОТРЕДАКТИРОВАНО

вот код для записи в файл csv


public static void writeInCsv(List<String> employeeIds, String directoryLocation) {
        String fileName = directoryLocation + "/empoyeeIds.csv" ;
        try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), StandardCharsets.UTF_8))) {
            String header = "Employee Ids";
            bw.write(header);
            bw.newLine();
            for (String id : employeeIds) {
                bw.write(id);
                bw.newLine();
            }
        } catch (UnsupportedEncodingException e) {
            LOG.error("Unsupported encoding format", e);
        } catch (FileNotFoundException e) {
            LOG.error("Error creating the file ", e);
        } catch (IOException e) {
            LOG.error("Error creating csv file", e);
        }
    }

Привет, спасибо, это помогает. Но теперь у меня другая проблема. Данные не записываются в файл excel.

Sonika Kushwaha 14.04.2023 07:38

я отредактировал ответ и добавил код для записи в CSV-файл.

Watermelon 14.04.2023 10:46

Другие вопросы по теме