Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Spring e json

  1. #1

    Spring e json

    ciao!

    dovrei mettere su una pagina web i risultati provenienti da un web service in formato json.
    come libreria ho usato gson visto che già la conoscevo.
    nel controller ho fatto così:
    codice:
    @Controller
    public class HomeController {
    
        @RequestMapping(value = "/index", method = RequestMethod.GET)
        public String home(Locale locale, Model model) throws MalformedURLException, IOException {
            Date date = new Date();
            DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
            String formattedDate = dateFormat.format(date);
            model.addAttribute("serverTime", formattedDate);
            ArrayList<ArrayList<String>> tabella = new ArrayList<>();
            Gson gson = new Gson();
            JsonParser parser = new JsonParser();
            try (BufferedReader bf = new BufferedReader(new InputStreamReader(new URL(".............").openStream()))) {
                JsonArray jarray = parser.parse(new JsonReader(bf)).getAsJsonArray();
                for (JsonElement e : jarray) {
                    Book book = gson.fromJson(e, Book.class);
                    ArrayList<String> list = new ArrayList<>();
                    list.add(String.valueOf(book.id));
                    list.add(book.title);
                    list.add(book.author);
                    list.add(book.editor);
                    list.add(String.valueOf(book.price));
                    list.add(book.isbn);
                    list.add(book.note);
                    tabella.add(list);
                }
            }
            model.addAttribute("books", tabella);
            return "home";
        }
    
    }
    e poi nella pagina:
    codice:
    <c:if test="${not empty books}">
                <ul>
                    <c:forEach var="book" items="${books}">
                        <li>${book}</li>
                        </c:forEach>
                </ul>
            </c:if>
    come vedete però si tratta di un ArrayList<ArrayList<String>> e quindi nella pagina vedo i risultati così:
    codice:
    • [87, 2001 odissea nello spazio, arthur c. clarke, longanesi, 0.0, , ]
    • [86, 2010 odissea due, arthur c. clarke, rizzoli, 0.0, , ]
    come faccio a suddividere ulteriormente la stringa per vedere, ad esempio, solo titolo e autore??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Beh... invece di stampare direttamente "${book}", usa questo "book" in un altro for-each. In questo modo stampi tutti i suoi valori.


    codice:
    <c:forEach var="book" items="${books}">
       <c:forEach var="prop" items="${book}">
          <li>${prop}</li>
       </c:forEach>
    </c:forEach>

    Per come hai strutturato la cosa, stampare solo titolo e autore è problematico perchè devi crearti una variabile da usare come contatore e stampare solo quando tale variabile assume i valori 1 e 2 (poichè tu inserisci, nell'ordine: ID, titolo, autore, editore, ecc).


    codice:
    <c:forEach var="book" items="${books}">
       <c:set var="propCount" value="0" />
       <c:forEach var="prop" items="${book}">
          <c:if test="${propCount == 1 || propCount == 2}">
             <li>${prop}</li>
          </c:if>
          <c:set var="propCount" value="${propCount + 1}" />
       </c:forEach>
    </c:forEach>

    La cosa sarebbe stata decisamente più semplice se, invece di avere un List<List<String>> per i libri con le loro proprietà, avessi creato un bean "Libro" con tutte le sue proprietà e avessi usato un List<Libro> (che è quello che si fa di solito). Supponendo di avere la classe Libro con tutte le sue belle proprietà:


    codice:
    <c:forEach var="book" items="${books}">
       <li>${book.titolo} - ${book.autore}</li>
    </c:forEach>

    Ciao.
    Ultima modifica di LeleFT; 07-08-2014 a 11:25
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    ciao!

    grazie per la risposta.

    ho seguito il tuo consiglio, non ci avevo minimamente pensato avendo ripreso il codice da un altro progetto.
    ho fatto al volo un bean apposito:
    codice:
    public class BookBean {
    
        private int id;
        private String title;
        private String author;
        private String editor;
        private double price;
        private String isbn;
        private String note;
    
        public BookBean(int id, String title, String author, String editor, double price, String isbn, String note) {
            this.id = id;
            this.title = title;
            this.author = author;
            this.editor = editor;
            this.price = price;
            this.isbn = isbn;
            this.note = note;
        }
    
        public String getTitle() {
            return title;
        }
    ..................
    }
    nel controller:
    codice:
        @RequestMapping(value = "/home", method = RequestMethod.GET)
        public String home(Locale locale, Model model) throws MalformedURLException, IOException {
            Date date = new Date();
            DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
            String formattedDate = dateFormat.format(date);
            model.addAttribute("serverTime", formattedDate);
            Gson gson = new Gson();
            JsonParser parser = new JsonParser();
            ArrayList<BookBean> list = new ArrayList<>();
            try (BufferedReader bf = new BufferedReader(new InputStreamReader(new URL("........").openStream()))) {
                JsonArray jarray = parser.parse(new JsonReader(bf)).getAsJsonArray();
                for (JsonElement e : jarray) {
                    Book book = gson.fromJson(e, Book.class);
                    list.add(new BookBean(book.id, book.title, book.author, book.editor, book.price, book.isbn, book.note));
                }
            }
            model.addAttribute("books", list);
            return "home";
        }
    nella jsp:
    codice:
    <c:if test="${not empty books}">
        <ul>
            <c:forEach var="book" items="${books}">
                <li>${book.title}</li>
            </c:forEach>
        </ul>
    </c:if>
    cosi funziona.
    grazie!!

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Solo una precisazione:


    codice:
    public class BookBean implements java.io.Serializable {

    trattandosi di un bean, deve essere serializzabile, per evitare problemi con l'eventuale persistenza delle sessioni applicata dal ServletContainer / ApplicationServer.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    ok grazie per il consiglio, provvedo subito!!


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.