Jak analizować tablicę JSON (nie obiekt Json) w systemie Android


90

Mam problem ze znalezieniem sposobu na przeanalizowanie JSONArray. To wygląda tak:

[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"},...]

Wiem, jak to przeanalizować, jeśli JSON został napisany inaczej (innymi słowy, gdybym zwrócił obiekt json zamiast tablicy obiektów). Ale to wszystko, co mam i muszę z tym iść.

* EDYCJA: jest to poprawny plik json. Zrobiłem aplikację na iPhone'a przy użyciu tego json, teraz muszę to zrobić dla Androida i nie mogę tego rozgryźć. Istnieje wiele przykładów, ale wszystkie są związane z JSONObject. Potrzebuję czegoś do JSONArray.

Czy ktoś może mi dać jakąś wskazówkę, poradnik lub przykład?

Bardzo cenione!


1
Spróbuj tego, aby sprawdzić, czy twój plik
An-droid

czy używasz jakiejkolwiek biblioteki do analizowania json? Użyj biblioteki gson do analizy json.
nilkash

To jest ważne. Przetłumaczyłem to w aplikacji, którą zrobiłem dla iPhone'a i działa. Po prostu nie wiem, jak to zrobić na Androidzie
SteBra

1
@nikash, tak, zauważyłem, że mogę użyć gson. Jedynym problemem jest to, że wszystkie znalezione przeze mnie przykłady dotyczą analizowania obiektu JSONObject, a nie JSONArray
SteBra

Opublikuj kod, który wypróbowałeś do tej pory, pomocne będzie udzielenie dokładnej odpowiedzi.
Spring Breaker,

Odpowiedzi:


147

Użyj następującego fragmentu kodu, aby przeanalizować JsonArray.

JSONArray jsonarray = new JSONArray(jsonStr);
for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    String name = jsonobject.getString("name");
    String url = jsonobject.getString("url");
}

Mam nadzieję, że to pomoże.


tylko jedno pytanie, jeśli jsonarray zawiera liczby, takie jak [2]. [4] i że cyfry wewnątrz zawierają ponownie tablicę, więc jeśli chcę pobrać z, szczególnie powiedzmy, że tablica zagnieżdżona w numeric [4] w kodzie java muszę napisać int i = 4 ???
BiggDawgg

@BiggDawgg: Cieszę się, że ci pomogło. Opublikuj swoje pytanie w osobnym wątku z danymi JSON, aby było mi łatwo odpowiedzieć.
Spring Breaker

26

Podam tylko mały przykład Jacksona :

Najpierw utwórz uchwyt danych, który ma pola z ciągu JSON

// imports
// ...
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDataHolder {
    @JsonProperty("name")
    public String mName;

    @JsonProperty("url")
    public String mUrl;
}

I przeanalizuj listę MyDataHolders

String jsonString = // your json
ObjectMapper mapper = new ObjectMapper();
List<MyDataHolder> list = mapper.readValue(jsonString, 
    new TypeReference<ArrayList<MyDataHolder>>() {});

Korzystanie z elementów listy

String firstName = list.get(0).mName;
String secondName = list.get(1).mName;

Czy możesz dać mi przykład, w jaki sposób mogę uzyskać JSON jako ciąg z adresu URL, który mam?
SteBra

1
W DefaultHttpClientexecute-metoda jest blokowanie połączeń, więc to musi być zrobione w zadania w tle, tak aby wyjaśnić, dlaczego jest w oddzielnej klasie.
vilpe89

Otrzymuję błąd dotyczący konstruktora HttpGetTask. „Konstruktor HttpGetTask (OnHttpGetCompletedListener) odwołuje się do brakującego typu OnHttpGetCompletedListener”
SteBra

1
czy zaimportowałeś OnHttpGetCompletedListener? W ten sposóbimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89

1
Tak, to był problem ... Dzięki za rozwiązanie mojego problemu :)
SteBra

20
public static void main(String[] args) throws JSONException {
    String str = "[{\"name\":\"name1\",\"url\":\"url1\"},{\"name\":\"name2\",\"url\":\"url2\"}]";

    JSONArray jsonarray = new JSONArray(str);


    for(int i=0; i<jsonarray.length(); i++){
        JSONObject obj = jsonarray.getJSONObject(i);

        String name = obj.getString("name");
        String url = obj.getString("url");

        System.out.println(name);
        System.out.println(url);
    }   
}   

Wynik:

name1
url1
name2
url2

12

Utwórz klasę do przechowywania obiektów.

public class Person{
   private String name;
   private String url;
   //Get & Set methods for each field
}

Następnie deserializuj w następujący sposób:

Gson gson = new Gson();
Person[] person = gson.fromJson(input, Person[].class); //input is your String

Artykuł referencyjny: http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/


Zakładam, że to „wejście” będzie adresem URL do tego pliku json? czy jest to coś innego?
SteBra

To bardzo proste rozwiązanie. Moim zdaniem powinna być akceptowana
FabioC

6

@Stebra Zobacz ten przykład. To może ci pomóc.

public class CustomerInfo 
{   
    @SerializedName("customerid")
    public String customerid;
    @SerializedName("picture")
    public String picture;

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

A kiedy otrzymasz wynik; analizować w ten sposób

List<CustomerInfo> customers = null;
customers = (List<CustomerInfo>)gson.fromJson(result, new TypeToken<List<CustomerInfo>>() {}.getType());

1
Zmienną wynikową jest Twój ciąg
JSONArray

Czy zmienną wynikową byłby adres URL, z którego muszę pobrać plik json, czy już pobrany plik json?
SteBra

zdecydowanie najłatwiejsze rozwiązanie
0x6C38

6

W tym przykładzie w jednej tablicy JSON znajduje się kilka obiektów. To jest,

Oto tablica json: [{"name": "name1", "url": "url1"}, {"name": "name2", "url": "url2"}, ...]

To jest jeden obiekt: {"name": "name1", "url": "url1"}

Zakładając, że otrzymałeś wynik do zmiennej typu String o nazwie jSonResultString:

JSONArray arr = new JSONArray(jSonResultString);

  //loop through each object
  for (int i=0; i<arr.length(); i++){

  JSONObject jsonProductObject = arr.getJSONObject(i);
  String name = jsonProductObject.getString("name");
  String url = jsonProductObject.getString("url");


}

Trudno mi jest uzyskać mój ciąg JSON z adresu URL. Może mógłbyś w tym pomóc?
SteBra,

Dziękuję za podzielenie go przykładami, dobra klarowność
ryvianstyron

3

Wspomniano już o kilku świetnych sugestiach. Korzystanie z GSON jest naprawdę przydatne, a aby uczynić życie jeszcze łatwiejszym, możesz wypróbować tę witrynę . Nazywa się jsonschema2pojo i robi dokładnie to:

Dajesz mu swój json i generuje obiekt java, który można wkleić w twoim projekcie. Możesz wybrać GSON, aby dodać adnotacje do swoich zmiennych, więc wyodrębnienie obiektu z json jest jeszcze łatwiejsze!


2

Moja sprawa Załaduj z serwera - przykład ..

int jsonLength = Integer.parseInt(jsonObject.getString("number_of_messages"));
            if (jsonLength != 1) {
                for (int i = 0; i < jsonLength; i++) {
                    JSONArray jsonArray = new JSONArray(jsonObject.getString("messages"));
                    JSONObject resJson = (JSONObject) jsonArray.get(i);
                    //addItem(resJson.getString("message"), resJson.getString("name"), resJson.getString("created_at"));
                }

Mam nadzieję, że to pomoże


ps "jsonObject.getString (" messages ")" type to jsonArray; pierwsza istniejąca odpowiedź brzmi: nie można przekonwertować ciągu znaków na jsonArray; Naprawię to.
최봉재

-1

Utwórz klasę Java POJO dla obiektów na liście w następujący sposób:

class NameUrlClass{
       private String name;
       private String url;
       //Constructor
       public NameUrlClass(String name,String url){
              this.name = name;
              this.url = url; 
        }
}

Teraz po prostu utwórz Listę NameUrlClass i zainicjuj ją do ArrayList w następujący sposób:

List<NameUrlClass> obj = new ArrayList<NameUrlClass>;

Możesz użyć przechowuj tablicę JSON w tym obiekcie

obj = JSONArray;//[{"name":"name1","url":"url1"}{"name":"name2","url":"url2"},...]

1
Nie jest jasne, co obj = JSONArray;ma robić. Co jest JSONArrayw tym kontekście? Skąd to pochodzi? Jaki jest cel inicjalizacji obja new ArrayList<NameUrlClass>, skoro i tak zamieniasz go bezpośrednio później?
Max Vollmer

-3

Stary post, który znam, ale chyba że źle zrozumiałem pytanie, to powinno załatwić sprawę:

s = '[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"}]';
eval("array=" + s);
for (var i = 0; i < array.length; i++) {
for (var index in array[i]) {
    alert(array[i][index]);
}

}


-3
            URL url = new URL("your URL");
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream stream = connection.getInputStream();
            BufferedReader reader;
            reader = new BufferedReader(new InputStreamReader(stream));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            //setting the json string
            String finalJson = buffer.toString();

            //this is your string get the pattern from buffer.
            JSONArray jsonarray = new JSONArray(finalJson);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.