Dark_Sage Δημοσ. 12 Δεκεμβρίου 2013 Δημοσ. 12 Δεκεμβρίου 2013 Hello, Εχω ενα απλό json: {"id":123456,"name":"test1","code":17} και έστω οτι το παίρνω απο ενα url Οπως βλέπετε δεν έχει JSONArray αλλά μόνο ArrayObjects. Εστω οτι εχω έτοιμο τον JSONParser. Στον κύριο κώδικα μου πως διαβάζω αυτό το json. εχω δοκιμάσει (χοντρικά ο κώδικας): private static final String ΝΑΜΕ = "name"; private static final String ID = "id"; JSONParser jParser = new JSONParser(); JSONObject json = jParser.getJSONFromUrl(url); try { myJSON = json.getJSONArray(""); for(int i = 0; i < myJSON.length(); i++){ JSONObject c = myJSON.getJSONObject(i); String id = c.getString(ID); String name = c.getString(NAME); . . . } αλλά δεν παίζει... τι κάνω λάθος? ευχαριστώ
nilosgr Δημοσ. 12 Δεκεμβρίου 2013 Δημοσ. 12 Δεκεμβρίου 2013 Γιατι δε χρησημοποιεις Gson ή Jackson και να παρεις ετοιμο το POJO απο εδω ; EDIT: Τι error βγαζει; Μηπως φταιει η getJSONFromUrl() επειδη τρεχει στο UI Thread EDIT2: Δες κι αυτο 2
Dark_Sage Δημοσ. 12 Δεκεμβρίου 2013 Μέλος Δημοσ. 12 Δεκεμβρίου 2013 (επεξεργασμένο) σε ευχαριστώ για την απάντηση. Θα ήθελα ιδανικά μία λύση όπως το παω εγώ τώρα παρά να κοιτάξω άλλα frameworks για JSON. Η getJSONFromUrl() δουλεύει κανονικά. Το πρόβλημα είναι κάπου οταν παω να ορίσω το array edit: 12-12 16:10:43.358: V/TEST(3088): index={"status":{"status_code":401,"message":"Access denied"}} κάτι παίζει με τo json μάλλον και το request. Οταν βάζω στο browser το url μου βγάζει κανονικά το json. Ενω εδώ όχι... καμία ιδέα κανείς τι φταίει? edit2: για να προλάβω κάποιους στο manifest εχω <uses-permission android:name="android.permission.INTERNET"></uses-permission> edit3: Με την getJSONFromUrl() και άλλο json μια χαρά μου το επιστρέφει... Δεν μπορώ να καταλάβω γιατι σκαλώνει με αυτό Επεξ/σία 12 Δεκεμβρίου 2013 από Dark_Sage
nilosgr Δημοσ. 12 Δεκεμβρίου 2013 Δημοσ. 12 Δεκεμβρίου 2013 Για δώσε ένα stacktrace με το exception...
Dark_Sage Δημοσ. 12 Δεκεμβρίου 2013 Μέλος Δημοσ. 12 Δεκεμβρίου 2013 Για δώσε ένα stacktrace με το exception... δεν παίρνω κάποιο exception. απλά δεν διαβάζει το json και μετά μου βγάζει κενή τη λίστα. εκτός και αν εννοείς κάτι άλλο
nilosgr Δημοσ. 13 Δεκεμβρίου 2013 Δημοσ. 13 Δεκεμβρίου 2013 Μηπως ειναι server-side το προβλημα ή κανεις λαθος request;;
Dark_Sage Δημοσ. 13 Δεκεμβρίου 2013 Μέλος Δημοσ. 13 Δεκεμβρίου 2013 Μαλλον θελει μπισκοτο ή καποιο τοκεν. που αναφέρεσαι? στο url που δεν μου παιζει μεσα στο json request περνάω το key μου. Αρα απο authentication looks OK. Ειδικά όταν το ίδιο url μου επιστρέφει το json στο browser. Νομίζω το πρόβλημα είναι στον parser του json. Παραθέτω τον κώδικα (δεν είναι δικός μου - έτοιμο τον βρήκα). Και στον parser μου επιστρέφει access denied import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONException; import org.json.JSONObject; import android.util.Log; public class JSONParser { static InputStream is = null; static JSONObject jObj = null; static String json = ""; // constructor public JSONParser() { } public JSONObject getJSONFromUrl(String url) { // Making HTTP request try { // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); json = sb.toString(); //ΑΥΤΟ ΤΟ LOG ΕΒΑΛΑ ΕΓΩ ΚΑΙ ΜΟΥ ΓΥΡΝΑΕΙ ΚΑΙ ΕΔΩ ACCESS DENIE //ΑΡΑ ΤΟ JSON ΠΟΤΕ ΔΕΝ ΤΟ ΠΑΙΡΝΩ Log.v("myapp", "json = " + json); } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); } // try parse the string to a JSON object try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } // return JSON String return jObj; } }
ZAKKWYLDE Δημοσ. 13 Δεκεμβρίου 2013 Δημοσ. 13 Δεκεμβρίου 2013 (επεξεργασμένο) Έχω την εντύπωση ότι το πρόβλημά σου είναι Server Side. Να ξέρεις ότι το Apache Client που χρησιμοποιείς πλέον δεν υποστηρίζεται απο το Android (λειτουργεί αλλά δεν το συνιστά η Google). Οπότε καλό είναι να χρησιμοποιείς το παλιό καλό HttpUrlConnection Πάρε ένα παράδειγμα δικού μου κώδικα. Είναι λίγο διαφορετική η λογική (εγώ επιστρέφω response και κρατάω το Json String σε instance variable. public int getJSONStringFromURL(String uri) { BufferedReader br = null; int responseCode = 0; try { URL url = new URL(uri); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Accept", "application/json"); conn.setConnectTimeout((int) TimeUnit.SECONDS .toMillis(REQUEST_TIMEOUT_SECONDS)); // open buffered reader and set encoding to UTF-8 br = new BufferedReader(new InputStreamReader( conn.getInputStream(), Charset.forName("UTF-8"))); if ((responseCode = conn.getResponseCode()) == HttpURLConnection.HTTP_OK) { StringBuilder sb = new StringBuilder(); String line = null; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } json = sb.toString();//instance variable } conn.disconnect(); } catch (Exception e) { } finally { if (br != null) try { br.close(); } catch (IOException e) { e.printStackTrace(); } } return responseCode; } Επεξ/σία 13 Δεκεμβρίου 2013 από ZAKKWYLDE 1
Dark_Sage Δημοσ. 13 Δεκεμβρίου 2013 Μέλος Δημοσ. 13 Δεκεμβρίου 2013 @ZAKKWYLDE: Σε ευχαριστώ ΠΑΡΑ πολύ. Ο parser σου δουλεύει τέλεια και μου γυρνάει επιτέλους το JSON! Επειδή είμαι καινούργιος στο android προσπαθω να καταλάβω την διαφορά των 2 υλοιποιήσεων τώρα. Αρα εσύ τώρα κρατάς στη μεταβλητη json την απάντηση απο το url και επιστρέφεις ενα response code. Στην υλοποιηση σου τωρα το json θα το δουλέψω με τον κλασσικό τρόπο? Δεν χρειάζεται το method σου να το αλλάξω να γυρνάει JSONObject? Αν όχι θα μπορούσες να μου πεις πως να διαχειριστώ το json που παίρνω απο τον parser σου? Απλά με μπερδεύει το int return
warlock9_0 Δημοσ. 13 Δεκεμβρίου 2013 Δημοσ. 13 Δεκεμβρίου 2013 το response code που σου κάνει return είναι για να δεις αν πήρες το json επιτυχώς αυτό που έχει γράψει βάζει ότι σου γυρίσει το request, αν γίνει επιτυχώς, σε μια string μεταβλητή json έξω από τo function από εκεί και πέρα εσύ πρέπει να την κάνεις parse όπως θες αλλιώς μπορείς να το αλλάξεις και αντί για int να σου γυρνάει είτε το json string του response, είτε json object (άρα να κάνεις το parse εκεί μέσα), είτε ότι σε βολεύει
ZAKKWYLDE Δημοσ. 13 Δεκεμβρίου 2013 Δημοσ. 13 Δεκεμβρίου 2013 (επεξεργασμένο) @ZAKKWYLDE: Σε ευχαριστώ ΠΑΡΑ πολύ. Ο parser σου δουλεύει τέλεια και μου γυρνάει επιτέλους το JSON! Επειδή είμαι καινούργιος στο android προσπαθω να καταλάβω την διαφορά των 2 υλοιποιήσεων τώρα. Αρα εσύ τώρα κρατάς στη μεταβλητη json την απάντηση απο το url και επιστρέφεις ενα response code. Στην υλοποιηση σου τωρα το json θα το δουλέψω με τον κλασσικό τρόπο? Δεν χρειάζεται το method σου να το αλλάξω να γυρνάει JSONObject? Αν όχι θα μπορούσες να μου πεις πως να διαχειριστώ το json που παίρνω απο τον parser σου? Απλά με μπερδεύει το int return Επιστρέφω το return code για να δω τελικά αν θα κάνω ότι τέλος πάντων ήθελα να κάνω με το JSON object. Τo JSON String που παίρνω το κρατάω σαν instance variable. Οπότε ουσιαστικά απο εκεί που το καλώ κάνω το εξής: public void doStuff() { JSONParser j = new JSONParser(); int response = j.getJSONStringFromURL("http://blabla.com"); String json = j.getJson(); //...Convert String to JSONObject } Επειδή το έγραψα βιαστικά αν δεν έγινα κατανοητός πες μου να σου γράψω ενα πιο αναλυτικό παράδειγμα . Γενικώς δεν είναι καλή ιδέα η μέθοδός σου να κάνει περισσότερα απο ότι πρέπει. Η δουλειά της συγκεκριμένης είναι να παίρνει ένα String και ένα Response απο ένα URL. Για να μη σου πώ ότι έπρεπε να σπάσω τα 2 αυτά σε 2 μεθόδους. Για παράδειγμα σε κάποια φάση μπορείς να αποφασίσεις να χρησιμοποιήσεις το Gson το οποίο θέλει JSON σε string και όχι σε JSONObject...οπότε αν έχεις τη μέθοδο έτσι θα βολεύει. Γι'αυτό το λόγο θα έκανα τη μετατροπή σε JSONObject εκτός αυτής της μεθόδου. Αλλά αυτό είναι καθαρά θέμα design decision δικού σου. Επεξ/σία 13 Δεκεμβρίου 2013 από ZAKKWYLDE
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα