Cara mengurai JSON Array (Bukan Json Object) di Android

90

Saya kesulitan menemukan cara untuk mengurai JSONArray. Ini terlihat seperti ini:

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

Saya tahu cara menguraikannya jika JSON ditulis berbeda (Dengan kata lain, jika saya mengembalikan objek json alih-alih array objek). Tapi hanya itu yang saya miliki dan harus saya ikuti.

* EDIT: Ini adalah json yang valid. Saya membuat aplikasi iPhone menggunakan json ini, sekarang saya perlu melakukannya untuk Android dan tidak dapat mengetahuinya. Ada banyak contoh di luar sana, tetapi semuanya terkait dengan JSONObject. Saya butuh sesuatu untuk JSONArray.

Bisakah seseorang memberi saya beberapa petunjuk, atau tutorial atau contoh?

Sangat dihargai!

SteBra
sumber
1
Coba ini untuk melihat apakah json Anda valid json.parser.online.fr
An-droid
apakah Anda menggunakan pustaka untuk mengurai json? Gunakan pustaka gson untuk parsing json. Sangat Bermanfaat.
nilkash
Itu valid. Saya menguraikannya di aplikasi yang saya lakukan untuk iPhone Dan itu berfungsi. Saya hanya tidak tahu cara melakukannya di Android
SteBra
1
@nikash, ya saya perhatikan saya bisa menggunakan gson. satu-satunya masalah adalah, semua contoh yang saya temukan adalah untuk mem
SteBra
Posting kode Anda yang telah Anda coba sejauh ini. Akan sangat membantu untuk memberikan jawaban yang tepat.
Spring Breaker

Jawaban:

147

gunakan potongan berikut untuk mengurai 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");
}

Semoga membantu.

Pemecah Musim Semi
sumber
hanya satu pertanyaan jika jsonarray menyertakan angka seperti [2]. [4] dan angka di dalamnya termasuk lagi array jadi jika saya ingin mengambil dari terutama katakanlah array bersarang dalam numerik [4] dalam kode java saya harus menulis int i = 4 ???
BiggDawgg
@BiggDawgg: Senang bisa membantu Anda. Posting pertanyaan Anda di utas terpisah dengan data JSON agar mudah bagi saya untuk menjawab.
Spring Breaker
26

Saya hanya akan memberikan sedikit contoh Jackson :

Pertama buat pemegang data yang memiliki bidang dari string JSON

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

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

Dan parsing daftar MyDataHolders

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

Menggunakan item daftar

String firstName = list.get(0).mName;
String secondName = list.get(1).mName;
vilpe89
sumber
Bisakah Anda memberi saya contoh bagaimana saya mendapatkan JSON sebagai string dari url yang saya miliki?
SteBra
1
Metode DefaultHttpClienteksekusi s adalah panggilan pemblokiran sehingga harus dilakukan di tugas latar belakang, hanya untuk menjelaskan mengapa ia berada di kelas terpisah.
vilpe89
Saya diberi kesalahan tentang konstruktor HttpGetTask. "Konstruktor HttpGetTask (OnHttpGetCompletedListener) merujuk ke jenis OnHttpGetCompletedListener yang hilang"
SteBra
1
sudahkah Anda mengimpor OnHttpGetCompletedListener? Seperti iniimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89
1
Ya, itulah masalahnya ... Terima kasih telah menyelesaikan masalah saya :)
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);
    }   
}   

Keluaran:

name1
url1
name2
url2
Maxim Shoustin
sumber
12

Buat kelas untuk menampung objek.

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

Kemudian deserialisasi sebagai berikut:

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

Artikel Referensi: http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/

Kevin Bowersox
sumber
Saya berasumsi bahwa "masukan" ini akan menjadi URL ke json itu? atau apakah itu sesuatu yang lain?
SteBra
Ini adalah solusi yang sangat sederhana. Seharusnya itu yang diterima menurut pandangan saya
FabioC
6

@Stebra Lihat contoh ini. Ini dapat membantu Anda.

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

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

Dan saat Anda mendapatkan hasilnya; parse seperti ini

List<CustomerInfo> customers = null;
customers = (List<CustomerInfo>)gson.fromJson(result, new TypeToken<List<CustomerInfo>>() {}.getType());
nilkash
sumber
1
Variabel hasil adalah String JSONArray Anda
nilkash
Apakah variabel hasil adalah url yang saya perlukan untuk mengambil json dari atau json yang sudah diambil?
SteBra
sejauh ini solusi termudah
0x6C38
6

Dalam contoh ini ada beberapa objek di dalam satu array json. Itu adalah,

Ini adalah array json: [{"name": "name1", "url": "url1"}, {"name": "name2", "url": "url2"}, ...]

Ini satu objek: {"name": "name1", "url": "url1"}

Dengan asumsi Anda telah mendapatkan hasil ke variabel String yang disebut 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");


}
TharakaNirmana
sumber
Saya mengalami kesulitan mendapatkan JSONstring saya dari URL. Mungkin Anda bisa membantu dengan itu?
SteBra
Terima kasih telah memecahnya dengan contoh, kejelasan yang baik
ryvianstyron
3

Beberapa saran bagus telah disebutkan. Menggunakan GSON memang sangat berguna, dan untuk membuat hidup lebih mudah Anda dapat mencoba situs web ini. Ini disebut jsonschema2pojo dan melakukan hal itu:

Anda memberikannya json Anda dan itu menghasilkan objek java yang dapat ditempelkan di proyek Anda. Anda dapat memilih GSON untuk membuat anotasi variabel Anda, jadi mengekstrak objek dari json Anda menjadi lebih mudah!

TomCB
sumber
2

Kasus saya Muat Dari Contoh Server ..

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

Semoga membantu

최봉재
sumber
ps "jsonObject.getString (" messages ")" jenisnya adalah jsonArray; jawaban pertama yang ada adalah tidak dapat mengubah string menjadi jsonArray; saya memperbaikinya.
최봉재
-1

Buat Kelas Java POJO untuk objek dalam daftar seperti:

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

Sekarang cukup buat List of NameUrlClass dan inisialisasi ke ArrayList seperti ini:

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

Anda dapat menggunakan simpan array JSON di objek ini

obj = JSONArray;//[{"name":"name1","url":"url1"}{"name":"name2","url":"url2"},...]
Devesh Pradhan
sumber
1
Tidak jelas apa obj = JSONArray;yang harus dilakukan. Apa JSONArraydalam konteks ini? Dari mana asalnya Apa tujuan menginisialisasi objdengan new ArrayList<NameUrlClass>, jika Anda menggantinya langsung setelahnya?
Max Vollmer
-3

Posting lama yang saya tahu, tetapi kecuali saya salah memahami pertanyaannya, ini akan berhasil:

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

}

Janus
sumber
-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);
boyke purnomo
sumber