Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

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);
                 .
                 .
                 .
}

αλλά δεν παίζει... τι κάνω λάθος?

 

ευχαριστώ

Δημοσ. (επεξεργασμένο)

σε ευχαριστώ για την απάντηση. Θα ήθελα ιδανικά μία λύση όπως το παω εγώ τώρα παρά να κοιτάξω άλλα 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 μια χαρά μου το επιστρέφει... Δεν μπορώ να καταλάβω γιατι σκαλώνει με αυτό

Επεξ/σία από Dark_Sage
Δημοσ.

Για δώσε ένα stacktrace με το exception...

 

δεν παίρνω κάποιο exception. απλά δεν διαβάζει το json και μετά μου βγάζει κενή τη λίστα.

 

εκτός και αν εννοείς κάτι άλλο

Δημοσ.

Μαλλον θελει μπισκοτο ή καποιο τοκεν.

 

 

που αναφέρεσαι? στο 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;

    }
}

Δημοσ. (επεξεργασμένο)

Έχω την εντύπωση ότι το πρόβλημά σου είναι 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;
	}
Επεξ/σία από ZAKKWYLDE
  • Like 1
Δημοσ.

@ZAKKWYLDE:

 

Σε ευχαριστώ ΠΑΡΑ πολύ. Ο parser σου δουλεύει τέλεια και μου γυρνάει επιτέλους το JSON!

 

Επειδή είμαι καινούργιος στο android προσπαθω να καταλάβω την διαφορά των 2 υλοιποιήσεων τώρα.

 

Αρα εσύ τώρα κρατάς στη μεταβλητη json την απάντηση απο το url και επιστρέφεις ενα response code. Στην υλοποιηση σου τωρα το json θα το δουλέψω με τον κλασσικό τρόπο? Δεν χρειάζεται το method σου να το αλλάξω να γυρνάει JSONObject?

 

Αν όχι θα μπορούσες να μου πεις πως να διαχειριστώ το json που παίρνω απο τον parser σου? Απλά με μπερδεύει το int return

Δημοσ.

το response code που σου κάνει return είναι για να δεις αν πήρες το json επιτυχώς

 

αυτό που έχει γράψει βάζει ότι σου γυρίσει το request, αν γίνει επιτυχώς, σε μια string μεταβλητή json έξω από τo function

από εκεί και πέρα εσύ πρέπει να την κάνεις parse όπως θες

 

αλλιώς μπορείς να το αλλάξεις και αντί για int να σου γυρνάει είτε το json string του response, είτε json object (άρα να κάνεις το parse εκεί μέσα), είτε ότι σε βολεύει

Δημοσ. (επεξεργασμένο)

@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 δικού σου.

Επεξ/σία από ZAKKWYLDE

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...