Android'de JSON Dizisi (Json Nesnesi Değil) nasıl ayrıştırılır


90

JSONArray'i nasıl ayrıştıracağımı bulmakta sorun yaşıyorum. Şöyle görünüyor:

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

JSON farklı yazıldıysa nasıl ayrıştırılacağını biliyorum (Başka bir deyişle, bir nesne dizisi yerine json nesnesi döndürdüyse). Ama sahip olduğum ve onunla gitmem gereken tek şey bu.

* DÜZENLEME: Geçerli bir json. Bu json kullanarak bir iPhone uygulaması yaptım, şimdi Android için yapmam gerekiyor ve çözemiyorum. Orada birçok örnek var, ancak hepsi JSONObject ile ilgili. JSONArray için bir şeye ihtiyacım var.

Biri bana biraz ipucu, öğretici veya örnek verebilir mi?

Çok takdir!



json'u ayrıştırmak için herhangi bir kitaplık kullanıyor musunuz? Json ayrıştırması için gson kitaplığını kullanın.Much Helpfull.
nilkash

Geçerlidir. Bunu bir iPhone için yaptığım bir uygulamada ayrıştırdım ve çalışıyor. Bunu Android'de nasıl yapacağımı bilmiyorum
SteBra

1
@nikash, evet gson kullanabileceğimi fark ettim. Tek sorun buldum tüm örnekler, bir JSONObject nesnesi değil JSONArray ayrıştırma içindir olduğunu
SteBra

Şimdiye kadar denediğiniz kodunuzu yazın, buna göre kesin bir cevap vermeniz faydalı olacaktır.
Spring Breaker

Yanıtlar:


147

JsonArray'i ayrıştırmak için aşağıdaki parçacığı kullanın.

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

Umarım yardımcı olur.


jsonarray [2] gibi rakamları içeriyorsa sadece bir soru. [4] ve içindeki sayısallar yine bir dizi içeriyor, bu yüzden özellikle almak istersem, özellikle java kodunda sayısal [4] 'e yerleştirilmiş diziyi söyleyelim, int i = 4 yazmalıyım ???
BiggDawgg

@BiggDawgg: Sana yardımcı olduğuna sevindim. Sorunuzu JSON verileriyle ayrı bir başlığa gönderin, böylece yanıtlamam kolay olacaktır.
Spring Breaker

26

Sadece küçük bir Jackson örneği vereceğim :

Öncelikle JSON dizesinden alanlara sahip bir veri sahibi oluşturun

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

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

Ve MyDataHolders listesini ayrıştırın

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

Liste öğelerini kullanma

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

Bana bir örnek verebilir misiniz JSON'u sahip olduğum url'den bir dize olarak nasıl alabilirim, lütfen?
SteBra

1
DefaultHttpClientS yürütmek-yöntem o ayrı sınıfta neden sadece netleştirmek için, bir arka plan görevi yapılmalıdır böylece bir engelleme çağrıdır.
vilpe89

HttpGetTask yapıcısı hakkında bir hata alıyorum. "Yapıcı HttpGetTask (OnHttpGetCompletedListener), eksik OnHttpGetCompletedListener türüne başvuruyor"
SteBra

1
OnHttpGetCompletedListener'ı içe aktardınız mı? Bunun gibiimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89

1
Evet, sorun buydu ... Sorunumu çözdüğünüz için teşekkürler :)
SteBra

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

Çıktı:

name1
url1
name2
url2

12

Nesneleri tutmak için bir sınıf oluşturun.

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

Ardından aşağıdaki şekilde seri durumdan çıkarın:

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

Referans Makalesi: http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/


Sanırım bu "giriş" o json'un URL'si olacak? yoksa başka bir şey mi?
SteBra

Bu çok basit bir çözüm. Benim görüşüme göre kabul edilen bu olmalı
FabioC

6

@Stebra Bu örneğe bakın. Bu size yardımcı olabilir.

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

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

Ve sonucu aldığınızda; böyle ayrıştır

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

1
Sonuç değişkeni JSONArray String'inizdir
nilkash

Sonuç değişkeni, json'u almam gereken veya json'dan zaten getirilmiş url mi?
SteBra

açık
farkla

6

Bu örnekte, bir json dizisi içinde birkaç nesne vardır. Yani,

Bu json dizisi: [{"ad": "ad1", "url": "url1"}, {"ad": "ad2", "url": "url2"}, ...]

Bu bir nesnedir: {"ad": "ad1", "url": "url1"}

JSonResultString adlı bir String değişkeninin sonucunu aldığınızı varsayarsak:

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


}

JSONstring'imi URL'den almakta zorlanıyorum. Belki bunda yardım edebilirsin?
SteBra

Örneklerle
parçaladığınız

3

Birkaç harika öneriden zaten bahsediliyor. GSON'u kullanmak gerçekten kullanışlı ve hayatı daha da kolaylaştırmak için bu web sitesini deneyebilirsiniz. Adı jsonschema2pojo ve tam olarak bunu yapıyor:

Ona json'unuzu verirsiniz ve projenize yapıştırabilen bir java nesnesi oluşturur. Değişkenlerinize açıklama eklemek için GSON'u seçebilirsiniz, böylece nesneyi json'unuzdan çıkarmak daha da kolaylaşır!


2

Durumum Sunucudan Yükleme Örneği ..

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

Umarım yardımcı olur


ps "jsonObject.getString (" mesajlar ")" türü jsonArray; ilk var olan yanıt, dizeyi jsonArray'e dönüştürülemez; düzeltirim
최봉재

-1

Listedeki nesneler için aşağıdaki gibi bir POJO Java Sınıfı oluşturun:

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

Şimdi basitçe bir NameUrlClass Listesi oluşturun ve bunu aşağıdaki gibi bir ArrayList olarak başlatın:

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

JSON dizisini bu nesnede depolayabilirsiniz

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

1
Ne yapacağı belli değil obj = JSONArray;. JSONArrayBu bağlamda ne var ? Nereden geliyor? Daha sonra onu doğrudan değiştirdiğinizde, obja ile ilklendirmenin amacı nedir new ArrayList<NameUrlClass>?
Max Vollmer

-3

Eski gönderi biliyorum, ancak soruyu yanlış anlamadıysam, bu hile yapmalı:

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.