Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Problema con parsing JSON

    ciao!

    da un servizio remoto, ottengo un json così:
    codice:
    {
        "index_searched": "isbn",
        "data": [
            {
                "urls_text": "",
                "title": "Beginning iOS 5 Development",
                "marc_enc_level": "~",
                "awards_text": "",
                "dewey_decimal": "005",
                "subject_ids": [
                    "computers_technology_apple",
                    "computers_technology_hardware_handheld_mobile_devices"
                ],
                "edition_info": "Paperback; 2011-12-07",
                "isbn13": "9781430236054",
                "physical_description_text": "7.5\"x9.2\"x1.9\"; 2.9 lb; 752 pages",
                "author_data": [
                    {
                        "name": "Mark, David",
                        "id": "mark_david"
                    },
                    {
                        "id": "nutting_jack",
                        "name": "Nutting, Jack"
                    },
                    {
                        "name": "Jeff LaMarche",
                        "id": "jeff_lamarche"
                    }
                ],
                "publisher_id": "apress",
                "language": "",
                "lcc_number": "",
                "isbn10": "1430236051",
                "title_long": "Beginning iOS 5 Development: Exploring the iOS SDK",
                "book_id": "beginning_ios_5_development",
                "summary": "...............................",
                "publisher_name": "Apress",
                "publisher_text": "Apress",
                "notes": "",
                "title_latin": "Beginning iOS 5 Development",
                "dewey_normal": "5"
            }
        ]
    }
    del quale a me interessa principalmente il campo summary.
    ho provato a farne il parsing così:
    codice:
            @Override
            protected Object doInBackground(Object... params) {
                try {
                    JSONObject jsonObj = new JSONObject(s.launchIsbndb(intent.getStringExtra("isbn")));
                    JSONArray jsonArray = jsonObj.getJSONArray("data");
    //                Log.i("RES: ", jsonArray.getString(0));
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject c = jsonArray.getJSONObject(i);
    //                    Log.i("RES: ", c.getString("summary"));
                    }
                } catch (IOException ex) {
                } catch (JSONException ex) {
                    Log.i("JSONEX: ", ex.getMessage());
                }
                return null;
            }
    ma ottengo questa eccezione nel parsing della stringa JSON:
    codice:
    JSONEX:    Expected ':' after r at character 6 of {r   "data" : [r      {r         "title_latin" : "Beginning Python: From Novice to Professional, Second Edition",r         "notes" : "",r         "dewey_normal" : "5",r         "title_long" : "Beginning Python: From Novice to Professional, Second Edition (Beginning from Novice to Professional)",r         "lcc_number" : "",r         "isbn10" : "1590599829",r         "book_id" : "beginning_python_from_novice_to_professional_second_edition",r         "publisher_text" : "Apress",r         "publisher_name" : "Apress",r         "summary" : ".........",r         "isbn13" : "9781590599822",r         "author_data" : [r            {r               "name" : "Magnus Lie Hetland",r               "id" : "magnus_lie_hetland"r            }r         ],r         "physical_description_text" : "6.9\"x9.2\"x1.5\"; 2.4 lb; 688 pages",r         "publisher_id" : "apress",r         "language" : "",r         "urls_text" : "",r         "marc_enc_level" : "~",r         "title" : "Beginning Python: From Novice to Professional, Second Edition",r         "dewey_decimal" : "005",r         "subject_ids" : [r            "computers_internet_programming_software_design_testing_engin",r            "computers_internet_programming_languages_tools_python",r            "computers_internet_programming_languages_tools_general",r            "computers_internet_general"r         ],r         "awards_text" : "",r         "edition_info" : "Paperback; 2008-09-08"r      }r   ],r   "index_searched" : "isbn"r}r
    la richiesta che faccio è questa:
    codice:
        public String launchIsbndb(String isbn) throws IOException {
            String stringUrl = "http://isbndb.com/api/v2/json/API_KEY/book/" + isbn.replaceAll("-", "");
            URL url = new URL(stringUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            InputStream is = connection.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));
            String line;
            StringBuilder response = new StringBuilder();
            while ((line = rd.readLine()) != null) {
                response.append(line);
                response.append('r');
            }
            rd.close();
            return response.toString();
        }
    ma non capisco tutte quelle r sparse qua e la.
    possibile un problema di encoding?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    response.append('r');
    ma non capisco tutte quelle r sparse qua e la.



    Quote Originariamente inviata da fermat Visualizza il messaggio
    possibile un problema di encoding?
    Le questioni sul charset/encoding sono un altro discorso. Nel tuo caso potrebbe andare bene di base ma comunque dovresti tenere presente la questione (perché non l'hai fatto).
    JSON generalmente viene trasferito in UTF-8. Il json che hai postato contiene solo parole inglesi, quindi in sostanza è ASCII.
    Tu hai usato new InputStreamReader(is), questo usa il charset di default della tua macchina. Che potrebbe andare bene oppure no ... dipende da che macchina è.

    Quindi se sai a priori che isbndb.com ti fornisce il json in UTF-8 devi specificarlo a InputStreamReader. Altrimenti se vuoi rendere dinamica la cosa, prendi il charset che il server sicuramente manda in response tra gli header.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    sorry, il mio cervello è in modalità week end .

    non so che charset usi il servizio.
    quindi ho cambiato il metodo così:
    codice:
        public String launchIsbndb(String isbn) throws IOException {
            String stringUrl = "http://isbndb.com/api/v2/json/API_KEY/book/" + isbn.replaceAll("-", "");
            URL url = new URL(stringUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            InputStream is = connection.getInputStream();
            Log.i("CS: ", connection.getHeaderFields().toString());
            BufferedReader rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String line;
            StringBuilder response = new StringBuilder();
            while ((line = rd.readLine()) != null) {
                response.append(line);
            }
            rd.close();
            return response.toString();
        }
    impostando UTF-8 ottengo cmq dei caratteri non corretti.
    mentre con connection.getHeaderFields().toString() ottengo questo:
    codice:
    {
    null=[HTTP/1.1 200 OK], 
    Connection=[keep-alive],
     Content-Length=[3664],
     Date=[Sat, 09 May 2015 14:44:52 GMT], 
    Server=[nginx/1.6.1],
     X-Android-Received-Millis=[1431182692106],  
    X-Android-Response-Source=[NETWORK 200], 
    X-Android-Sent-Millis=[1431182691842], X-Catalyst=[5.90042]
    }
    ma non vedo il charset usato!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    non so che charset usi il servizio.
    Se quel servizio fornisce un minimo di documentazione decente, "dovrebbe" indicarlo.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    impostando UTF-8 ottengo cmq dei caratteri non corretti.
    Quali? cosa?

    Quote Originariamente inviata da fermat Visualizza il messaggio
    mentre con connection.getHeaderFields().toString() ottengo questo:
    codice:
    {
    null=[HTTP/1.1 200 OK], 
    Connection=[keep-alive],
     Content-Length=[3664],
     Date=[Sat, 09 May 2015 14:44:52 GMT], 
    Server=[nginx/1.6.1],
     X-Android-Received-Millis=[1431182692106],  
    X-Android-Response-Source=[NETWORK 200], 
    X-Android-Sent-Millis=[1431182691842], X-Catalyst=[5.90042]
    }
    ma non vedo il charset usato!
    Il default-encoding è comunque UTF-8. Comunque non hanno messo nemmeno il Content-Type, quindi nemmeno indicando es. application/json.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    allora.

    l'indirizzo da richiamare è diverso a seconda che si voglia xml o json.
    forse è per quello che non viene specificato il Content-Type.

    nel caso di xml si capisce che il charset UTF-8 dall'intestazione:
    codice:
    <?xml version="1.0" encoding="UTF-8"?>
    nel documentazion json non è specificato, ma a questo punto penso sia uguale.

    per quanto riguarda il testo, ho scoperto che nel log si vede bene.
    è nella TextView che si vede male.
    e nello spcecifico c'è il classico punto interrogativo al posto degli apostrofi.
    questa la TextView:
    codice:
            <TextView
                android:id="@+id/txt_res"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ems="10"
                android:padding="10dp">
            </TextView>

  6. #6
    così ho risolto:
    codice:
    String res = new String(c.getString("summary").getBytes("ISO-8859-1"), "UTF-8");
    myTextView.setText(res);
    grazie per l'aiuto!!

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.