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!
Odpowiedzi:
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.
źródło
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;
źródło
DefaultHttpClient
execute-metoda jest blokowanie połączeń, więc to musi być zrobione w zadania w tle, tak aby wyjaśnić, dlaczego jest w oddzielnej klasie.import your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
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:
źródło
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/
źródło
@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());
źródło
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"); }
źródło
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!
źródło
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
źródło
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"},...]
źródło
obj = JSONArray;
ma robić. Co jestJSONArray
w tym kontekście? Skąd to pochodzi? Jaki jest cel inicjalizacjiobj
anew ArrayList<NameUrlClass>
, skoro i tak zamieniasz go bezpośrednio później?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]); }
}
źródło
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);
źródło