JSON parsowanie w androidzie

0

Czesc to jest strona z plikiem JSON http://maps.googleapis.com/maps/api/geocode/json?address=B%C3%A2rca&sensor=true&language=pl, ktory chcialbym sparsowac do swojej apki w androidzie i to czego potrzebuje to pobrac wszystkie obiekty "address_components" . Moglby ktos mi podpowiedziec jak to zrobic?

Z gory dzieki za odpowiedz!

0

Pod jakimi hasłami w Google szukałeś już rozwiązania?

0

prawde mowiac mialem problem jak to zdefiniowac zwlaszcza po angielsku, szukalem jedynie json tutorial in android itp, ale tam byly jakies standardowe przyklady nie to o co mi chodzilo. A masz jakas sugestie pod jakim haslem powinienem tego poszukac? Wiesz nie bardzo znam sie na tym JSON i parsowaniu tego, wiec jesli chcesz mi powiedziec ze moje pytanie nie nalezy do najmadrzejszych to smialo, nie krepuj sie

0

Dzieki za te linki, przejrzalem je, ale nadal wydaje mi sie ze nie ma w nich odpowiedzi na moje pytanie. Wiem ze moglbym to zrobic w sposob nazwijmy to "okrezny", czyli np tak
JSONObject jsonObject = new JSONObject(text);//Tekst to String stoworzony na bazie tego pliku JSON, ktory podalem w 1 linku
JSONArray jsonArray = jsonObject.getJSONArray("results");
JSONObject address_components = jsonArray.optJSONObject(0);
JSONArray jsonArray1 = address_components.getJSONArray("address_components");
i potem policzyc, ktorym obiektem bedzie kolejne address_components i znowu powtorzyc ten kod dla innego indexu. Ale mi chodzi o sposob bardziej ogolny, bo ten link, ktory podalem jest tylko przykladem. Gdybym pobieral plik JSON stad http://maps.googleapis.com/map[...]mp;sensor=true&language=pl
to juz address_components jest tylko jeden. Wiec tak na sztywno nie moge sobie tych obiektow pobrac. Stad tez moje pytanie sie wzielo, a wszystkie te tutoriale, ktore przejrzalem pokazuja tylko ten okrezny sposob, ktory w ogolnym przypadku nie bedzie mial dla mnie pozytku

0

Spojrz na ten plik JSON z tego tutoriala

"contacts": [
        {
                "id": "c200",
                "name": "Ravi Tamada",
                "email": "[email protected]",
                "address": "xx-xx-xxxx,x - street, x - country",
                "gender" : "male",
                "phone": {
                    "mobile": "+91 0000000000",
                    "home": "00 000000",
                    "office": "00 000000"
                }
        },
        {
                "id": "c201",
                "name": "Johnny Depp",
                "email": "[email protected]",
                "address": "xx-xx-xxxx,x - street, x - country",
                "gender" : "male",
                "phone": {
                    "mobile": "+91 0000000000",
                    "home": "00 000000",
                    "office": "00 000000"
                }
        },

Tutaj obiekt kontakt zawiera w sobie takie same elementy z id, name,mail itd. A u mnie tak nie ma oprocz "address_components" masz np "formatted_address i inne, wiec czesc z nich musze sparsowac a czesc musze olac i nie wiem jak rozroznic jedne od drugich . A tam w tym tutorialu tworzy sobie JSONArray z kontaktami i po tem jedzie po tej tablicy i z kazdego obiektu pobiera wszystko. I do elementow tej tablicy kontaktow odwoluje sie poprzez indexy , a ja w moim przypadku nie wiem jakie dokladnie indeksy beda mialy obiekty "address_components" stad wydaje mi sie ze nie moge zastosowac takiego tricku jak on tam.

Ale jak mowie mam mala wiedze na ten temat wiec moze moje rozumowanie jest bledne. Dlatego opisalem jak ja to widze, zebys mogl mi wytknac bledy

0

Jeżeli chodzi Ci o to jak się dobrać do konkretnego to możesz nie tylko po indeksie ale też po nazwie więc nie widzę problemu.

0

Ale jak? Zalozmy ze mam cos takiego
JSONObject jsonObject = new JSONObject(text);//Tekst to String stoworzony na bazie tego pliku JSON, ktory podalem w 1 linku
JSONArray jsonArray = jsonObject.getJSONArray("results");

czyli w jsonArray mam wszystkie swoje "address_components" plus smieci, ktore chce odrzucic. Moglbys prosze mi napisac teraz kod, ktory pozwoli mi z jsonArray dostac tylko i
wylacznie obiekty "address_components" ?

0

Tak na oko:
Tworzysz sobie obiekt z całości:

JSONObject jsonObj = new JSONObject(jsonStr);

Tworzysz sobie tablicę resultów:

JSONArray jsonArray = jsonObj.getJSONArray("results");

Lecisz sobie po tablicy w pętli:

for(int i = 0; i < jsonArray.length(); ++i) {
   JSONArray obiekt = jsonArray.getJSONObject(i);

Teraz:

JSONArray addressArray = obiekt.getJSONArray("address_components");

pętla po addressArray i w niej wyciągasz już to co chcesz. Pobierasz obiekty po indeksie tak jak w pierwszej pętli.

0

JSONArray addressArray = jsonArray.getJSONArray(i); mam to i skad mam wiedziec czy to jest "address_components" i czy chce cos z tego wyciagac czy tez to nie jest akurat to?

0

Zreszta w jsonArray masz nie tylko obiekty typu JSONArray ale tez Stringi np ten "formatted_address" : "Berlin, Niemcy", wiec nie jest przypadkiem tak, ze
for(int i = 0; i < jsonArray.length(); ++i) {
JSONArray addressArray = jsonArray.getJSONArray(i);
}
moze spowodowac blad?

2

A czemu nie użyjesz gotowej biblioteki? Np Gson?

0

No mam zamiar wykorzystac biblioteke gson. Ogolnie w moim zadaniu chodzi o to aby pobrac to co jest "long name" w "adress_component" i wyswietlic to w 2 activity.
I to jest fragment kodu, ktory za to ma odpowiadac(pobiera jednak tylko pierwse adress_component"

 JSONObject jsonObject = new JSONObject(text);
                    String status = jsonObject.getString("status");
                    if (status.equals("OK")) {
                        JSONArray jsonArray = jsonObject.getJSONArray("results");

                        JSONObject address_components = jsonArray.optJSONObject(0);
                        JSONArray jsonArray1 = address_components.getJSONArray("address_components");
                        JSONObject checkObj = jsonArray1.getJSONObject(0);
                        JSONArray checkArray = checkObj.getJSONArray("types");
                        String checkCity = checkArray.getString(0);
                        if (checkCity.equals("locality")) {
                            Gson gson = new Gson();
                            String textToParse = jsonArray1.toString();
                            adressComponentInfo = gson.fromJson(textToParse, AdressComponentInfo[].class);

a to moja klasa adressComponentInfo :

 public class AdressComponentInfo implements Serializable {
    @SerializedName("long_name")
    String long_name;
}

ma to sens wg Ciebie, czy jednak zle korzystam z tej biblioteki gson?

0

Napisze to tutaj, bo chce wrzucic tez kod. to co napisales @panryz do mnie przemawia. Ale teraz zebym mial jasnosc to musze napisac dwie klasy, w ktorych umieszcze dane z pliku JSON jedna bedzie mniej wiecej tak wygladac :

public class Info implements Serializable {
    @SerializedName("address_components" )
    AddressComponent addressComponents;
@SerializedName("status" )
String status;
}

a druga

public classAddressComponen implements Serializable{
@SerializedName( "long_name")
String status;
@SerializedName("short_name" )
String status;
@SerializedName("types")
String[] types;
}
0

Już lepiej. Po pierwsze nie musisz implementować Serializable. Po drugie nazwy klas piszemy wielkimi literami. Po trzecie brakuje Ci kilku pól np formatted_address, geometry. Po czwarte address_components to tablica.

1 użytkowników online, w tym zalogowanych: 0, gości: 1