Leggere Array di oggetti Json

di il
6 risposte

Leggere Array di oggetti Json

Ciao a tutti,
ho la necessità di leggere da un file .json una lista di oggetti che hanno varie proprietà, alcune sono di tipo String, altri sono altri oggetti incapsulati, array di valori, etc.
Pensavo di usare ObjectMapper
// create ObjectMapper instance
ObjectMapper objectMapperIn = new ObjectMapper();
//read the file by ObjectMapper
AtmDTO = objectMapperIn.readValue(file, ATMDTO.class);
,ma così riesco a leggere solamente un file che contiene un unico oggetto della lista.
Come posso estendere l'uso di ObjectMapper o di qualcos'altro per leggere tutta la lista?

Ciao e Grazie in anticipo
Fulvio

6 Risposte

  • Re: Leggere Array di oggetti Json

    fulviot66 ha scritto:


    Pensavo di usare ObjectMapper
    Con la nota Jackson Databind sì.

    fulviot66 ha scritto:


    Come posso estendere l'uso di ObjectMapper o di qualcos'altro per leggere tutta la lista?
    Se hai una struttura "array" con dentro oggetti "mappabili" alla tua classe ATMDTO, è sufficiente specificare che vuoi una lista (java.util.List) di ATMDTO. Ma va specificata con un costrutto particolare.

    List<ATMDTO> atmDTOs = objectMapperIn.readValue(file, new TypeReference<List<ATMDTO>>(){});

    La parte che ho evidenziato in blu è una anonymous inner class "vuota". C'è un motivo ben preciso: questo uso così di TypeReference è il modo che Jackson ha per "fissare" la parametrizzazione a List<ATMDTO> ed essendo una sottoclasse di TypeReference, a runtime è possibile estrarre le informazioni esatte sul fatto che List è parametrizzato <ATMDTO> .
  • Re: Leggere Array di oggetti Json

    Grazie @andbin,
    per la risposta, ma durante la scrittura del codice suggerito su NetBeans, ottengo:
    type TypeReference does not take parameters
    May split declaration into declaration and assignment
    Come risolvo?
    Ciao e Grazie
    Fulvio

    p.s. uso Java 1.8, c'entra qualcosa?
  • Re: Leggere Array di oggetti Json

    fulviot66 ha scritto:


    type TypeReference does not take parameters
    May split declaration into declaration and assignment
    p.s. uso Java 1.8, c'entra qualcosa?
    Si intende la

    com.fasterxml.jackson.core.type.TypeReference

    Verifica di non aver tirato in ballo un'"altra" TypeReference che magari hai in classpath.


    P.S. Se stai usando anche Spring Framework, esiste ad esempio
    org.springframework.asm.TypeReference
    Che ha lo stesso nome non qualificato ma non c'entra un piffero con la Jackson e quindi non è il TypeReference da usare!
  • Re: Leggere Array di oggetti Json

    Grazie per la precisazione @andbin,
    tuttavia ho ancora un problemino: infatti, il metodo che ho implementato per leggere l'elenco di oggetti, mi restituisce sempre e solo l'ultimo oggetto dell'elenco, ripetuto 1462 volte, ovvero per il numero totale degli oggetti.
    Nel metodo che segue deve esserci un errore che io non riesco a vedere, mi potresti aiutare a scoprirlo, per favore?
        @GetMapping("/list")
        public List<ATMDTO> getListAtmDTO() throws FileNotFoundException, IOException, Exception {
    
            // create List<ATMDTO> instance
            List<ATMDTO> listAtmDTO = new ArrayList<ATMDTO>();
            // create ATM Objects instances
            ATMDTO atmDTO = new ATMDTO();
            AddressDTO addressDTO = new AddressDTO();
            GeoLocationDTO geoLocationDTO = new GeoLocationDTO();
    
            try {
                // read json file and convert to ATMDTO object
                FileReader file = new FileReader(
                        "ATMs.json");
    
                // create ObjectMapper instance
                ObjectMapper objectMapperIn = new ObjectMapper();
    
                List<ATMDTO> listAtmDTOIn = objectMapperIn.readValue(file, new TypeReference<List<ATMDTO>>() {
                });
    
                for (ATMDTO cursor : listAtmDTOIn) {
                    geoLocationDTO.setLat(cursor.getAddress().getGeoLocation().getLat());
                    geoLocationDTO.setLng(cursor.getAddress().getGeoLocation().getLng());
                    addressDTO.setGeoLocation(cursor.getAddress().getGeoLocation());
                    atmDTO.setAddress(cursor.getAddress());
                    atmDTO.setDistance(cursor.getDistance());
                    atmDTO.setType(cursor.getType());
    
                    listAtmDTO.add(atmDTO);
                }
                
            } catch (FileNotFoundException fnfe) {
                throw new FileNotFoundException("ATMs.json file not found in resources directory, please retry");
            } catch (IOException ioe) {
                throw new IOException("Possible I/O Error, please retry");
            } catch (Exception e) {
                e.printStackTrace();
            };
                // return List<ATMDTO>
                return listAtmDTO;
        }
    Ciao e Grazie
    Fulvio
  • Re: Leggere Array di oggetti Json

    fulviot66 ha scritto:


            ATMDTO atmDTO = new ATMDTO();
    
                for (ATMDTO cursor : listAtmDTOIn) {
                    geoLocationDTO.setLat(cursor.getAddress().getGeoLocation().getLat());
                    geoLocationDTO.setLng(cursor.getAddress().getGeoLocation().getLng());
                    addressDTO.setGeoLocation(cursor.getAddress().getGeoLocation());
                    atmDTO.setAddress(cursor.getAddress());
                    atmDTO.setDistance(cursor.getDistance());
                    atmDTO.setType(cursor.getType());
    
                    listAtmDTO.add(atmDTO);
                }
    
    È il classicissimo "erroraccio" .... l'oggetto ATMDTO l'hai creato fuori/prima del for-each, quindi ne hai UNO solo che modifichi ad ogni ciclo. Quindi avrai una lista di N riferimenti allo stesso identico oggetto, che dopo il for avrà gli "ultimi" dati.
  • Re: Leggere Array di oggetti Json

    Grazie di tutte le tue spiegazioni.
    Ora il mio problema è risolto!
    Ancora Grazie
    Fulvio
Devi accedere o registrarti per scrivere nel forum
6 risposte