JSONarray'i ArrayList'e dönüştürme


107

Bir JSON dizesi indiriyorum ve bunu JSONArray'e dönüştürüyorum. Bunu bir liste görünümüne koyuyorum ve bu listview'den daha sonra silebilmem gerekiyor ve JSONArray'in .remove yöntemi olmadığı için (teşekkürler Obama), onu bir dizi listesine dönüştürmeye çalışıyorum.

işte JSON'um (array.toString ()):

[{"thumb_url":"tb-1370913834.jpg","event_id":"15","count":"44","event_tagline":"this is a tagline","event_name":"5th birthday","event_end":"1370919600","event_start":"1370876400"}]

Onu bir diziye almam ve dizeleri ilgili anahtarlarıyla çağırabilmem gerekiyor. Herhangi bir yardım için minnettarız!


Anahtar dediğinizde, bu bir tür Sözlük (Android'de Harita) anlamına gelmez mi? Bir dizi indeks tabanlı olacaktır. Bir göz atın developer.android.com/reference/java/util/Map.html oluşturmak ve kullanmak nasıl.
brianestey

Bir liste görünümünü özel bir temel bağdaştırıcıyla doldurmak için bir harita kullanılabilir mi? JSON'un sırayı değiştirmesi durumunda dizinleri kullanmayı tercih etmeyin.
TheGeekNess

ListView, bağdaştırıcıdaki nesneleri dizine göre alacaktır, bu nedenle her durumda listeyi bir sırayla tutmanız gerekecektir. Anahtarların sırasını korumak (ve derleme zamanında anahtarların ne olduğunu bilmek) istiyorsanız, bu anahtarların bir dizisini istediğiniz sırayla sabit kodlayabilir ve bunu Harita'dan getirirken siparişiniz için kullanabilirsiniz.
brianestey

Yanıtlar:


164
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
   for (int i=0;i<jArray.length();i++){ 
    listdata.add(jArray.getString(i));
   } 
} 

3
Ve listdata.add(jArray.optJSONObject(i));liste verileriniz bir JSONObject diziListesi ise. ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
Subin Sebastian

2
Güzel pasaj. Herhangi biri isterse tam olarak: JSONObject / JSONArray'i github gist.github.com/codebutler/2339666
inexcii

2
Neden bir kullanmıyorsunuz ArrayList<Object>?
natanavra

Json Array'i nasıl işleyebilirim boş. lütfen cevap ver kardeşim.
MohanRaj S

3
Bunu döngü olmadan yapmanın başka bir yolu var mı?
K.Sopheak

67

Gson(Google'dan) kullanarak yaptım .

Aşağıdaki satırı modülünüze ekleyin build.gradle:

dependencies {
  // ...
  // Note that `compile` will be deprecated. Use `implementation` instead.
  // See https://stackoverflow.com/a/44409111 for more info
  implementation 'com.google.code.gson:gson:2.8.2'
}

JSON string:

private String jsonString = "[\n" +
            "        {\n" +
            "                \"id\": \"c200\",\n" +
            "                \"name\": \"Ravi Tamada\",\n" +
            "                \"email\": \"ravi@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c201\",\n" +
            "                \"name\": \"Johnny Depp\",\n" +
            "                \"email\": \"johnny_depp@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c202\",\n" +
            "                \"name\": \"Leonardo Dicaprio\",\n" +
            "                \"email\": \"leonardo_dicaprio@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c203\",\n" +
            "                \"name\": \"John Wayne\",\n" +
            "                \"email\": \"john_wayne@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c204\",\n" +
            "                \"name\": \"Angelina Jolie\",\n" +
            "                \"email\": \"angelina_jolie@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c205\",\n" +
            "                \"name\": \"Dido\",\n" +
            "                \"email\": \"dido@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c206\",\n" +
            "                \"name\": \"Adele\",\n" +
            "                \"email\": \"adele@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c207\",\n" +
            "                \"name\": \"Hugh Jackman\",\n" +
            "                \"email\": \"hugh_jackman@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c208\",\n" +
            "                \"name\": \"Will Smith\",\n" +
            "                \"email\": \"will_smith@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c209\",\n" +
            "                \"name\": \"Clint Eastwood\",\n" +
            "                \"email\": \"clint_eastwood@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2010\",\n" +
            "                \"name\": \"Barack Obama\",\n" +
            "                \"email\": \"barack_obama@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2011\",\n" +
            "                \"name\": \"Kate Winslet\",\n" +
            "                \"email\": \"kate_winslet@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2012\",\n" +
            "                \"name\": \"Eminem\",\n" +
            "                \"email\": \"eminem@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        }\n" +
            "    ]";

ContactModel.java:

public class ContactModel {
     public String id;
     public String name;
     public String email;
}

JSON dizesini şuna dönüştürmek için kod ArrayList<Model>:

Not: Aşağıdakileri içe aktarmanız gerekir java.lang.reflect.Type;:

// Top of file
import java.lang.reflect.Type;

// ...

private void parseJSON() {
    Gson gson = new Gson();
    Type type = new TypeToken<List<ContactModel>>(){}.getType();
    List<ContactModel> contactList = gson.fromJson(jsonString, type);
    for (ContactModel contact : contactList){
        Log.i("Contact Details", contact.id + "-" + contact.name + "-" + contact.email);
    }
}

Umarım bu sana yardımcı olur.


4
ÜÇ HAT ... YAPILDI! Bence bu, (a) güzel çalışan sadece üç satır kod ve (b) JSONArray'den List <CustomObject> 'e yazılı bir çeviri gerçekleştirdiği için kabul edilen cevap olmalıydı. Teşekkür ederim!
John Ward

Bir JSONArray olmalı, JSONElement çalışmıyor gibi görünüyor. bu nedenle, getAsJsonArray()yöntemi görünüşte kullanın . Teşekkür ederim!
嘉 恒 陶

1
Tam olarak ihtiyacım olan şey, teşekkürler! Not: Bunları içe aktarmanız gerekir: java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
Chandrani H

Harika, Bu kabul edilen cevap olmalıydı !. Teşekkürler
Yeuni

bu, typetoken'ın korumalı olduğunu söyleyerek çalışmıyor
nikoss

7

bu şekilde deneyin Kendi dizinizi oluşturarak bunun üzerinden dönün. Bu kod, onun bir dizi dizisi olduğunu varsayar, belirli dizi yapınıza uyacak şekilde değiştirmek zor olmamalıdır.

JSONArray jsonArray = new JSONArray(jsonArrayString);
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );

6

JSON dizesini bir ArrayList'e veya hatta bir Map'e dönüştürmek yerine, kendi başına bir JSONObject oluşturabilirsiniz . Bu nesne, istediğiniz gibi anahtar ile dize değerlerini alma ve ayrıca nesneleri kaldırma yeteneğine sahiptir .

Bir oluşturmak için JSONObjectdüzgün şekilde biçimlendirilmiş bir JSON dizeden, sadece çağrı uygun yapıcı .

JSONObject json = new JSONObject(jsonString);

1
Özellikle bu çözümle karşılaştığım sorun, JSONObject'ler ve JSONArray'ler ile uğraşırken JSONException'ı atmalarıdır. Bazen bir JSONArray içeriğini JSON'dan haberdar olması gerekmeyen bir işleve geçirmek kullanışlıdır.
Aaron Dougherty

2
Katılıyorum. JSONObject'i, JSON metnini kullanılabilir bir model nesnesine ayrıştırmanın bir parçası olarak kullanırdım. Ortaya çıkan herhangi bir JSONException, JSON kaynağında bir sorun olduğunu gösterir, yani onu bir JSONArray veya JSONObject olarak, farklı bir model nesnesine ayrıştıramazsınız demektir.
brianestey

6

Hızlı bir çözümüm var. Sadece bir dosya oluşturunArrayUtil.java

import java.util.ArrayList;
import java.util.Collection;
import org.json.JSONArray;
import org.json.JSONException;

public class ArrayUtil
{
    public static ArrayList<Object> convert(JSONArray jArr)
    {
        ArrayList<Object> list = new ArrayList<Object>();
        try {
            for (int i=0, l=jArr.length(); i<l; i++){
                 list.add(jArr.get(i));
            }
        } catch (JSONException e) {}

        return list;
    }

    public static JSONArray convert(Collection<Object> list)
    {
        return new JSONArray(list);
    }

}

Kullanım:

ArrayList<Object> list = ArrayUtil.convert(jArray);

veya

JSONArray jArr = ArrayUtil.convert(list);

BirArrayList<String>

ArrayList <Object> 'i ArrayList <String>' e
aktarmanın

1
Bu cevaba şeref. Günümü çözdün! Bunu düzeltmek için 2 saat harcadım. Aslında benim sorunum ben dönüştürülmüş koymak istedim oldu JSONArrayben koymak böylece bir listeye Listbir de HashMapbu util oldukça iyi benim için çalıştı, bu yüzden. Teşekkürler @Vasilii Suricov
Jose Mhlanga

5

Java 8'de,

IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())

1
Bununla ilgili tek sorun, JSONArray.getString (...) 'nin eşlemenin içinde ele alınması gereken bir istisna atmasıdır, böylece List<String> listOfStrings = IntStream.range(0, array.length()).mapToObj(i -> { try { return array.getString(i); } catch (JSONException e) { throw new AssertionFailedError("JSONArray is not a list of Strings! " + e.getMessage()); } }).collect(Collectors.toList());artık o kadar zarif olmayan bir duruma sahip olursunuz . Bu yüzden bir foreach ile gideceğim :)
LazR

Buradaki en iyi cevap budur (imho), ancak jsonArray referansına birden fazla kez erişmeye gerek kalmasaydı zarif olurdu.
djangofan

4
 JSONArray array = new JSONArray(json);
 List<JSONObject> list = new ArrayList();
 for (int i = 0; i < array.length();list.add(array.getJSONObject(i++)));

2

Kullanışlı hale getirmek için POJO kullanın.

böyle dene ..

List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>();

JSONObject jsonObject = new JSONObject(jsonString);
YourPojoObject yourPojo = new YourPojoObject();
yourPojo.setId(jsonObject.getString("idName"));
...
...

yourPojos.add(yourPojo);

1

Gson kullanma

    List<Student> students = new ArrayList<>();
    JSONArray jsonArray = new JSONArray(stringJsonContainArray);
    for (int i = 0; i < jsonArray.length(); i++) {
        Student student = new Gson().fromJson(jsonArray.get(i).toString(), Student.class);
        students.add(student);
    }
    return students;

1

JSON dizesi dizisinden veri çıkarmak istiyorsanız, işte benim çalışma kodum. verileriniz olarak parametreyi değiştirin.


PoJo sınıfı

public class AllAppModel {
    private String appName;
    private String packageName;
    private int uid;
    private boolean isSelected;
    private boolean isSystemApp;
    private boolean isFav;
}

Verilerinizi aşağıdaki kod satırını kullanarak çıkarın

try {
    JSONArray jsonArr = new JSONArray("Your json string array");
    List<AllAppModel> lstExtrextData = new ArrayList<>();
    for (int i = 0; i < jsonArr.length(); i++) {
        JSONObject jsonObj = jsonArr.getJSONObject(i);
        AllAppModel data = new AllAppModel();
        data.setAppName(jsonObj.getString("appName"));
        data.setPackageName(jsonObj.getString("packageName"));
        data.setUid(jsonObj.getInt("uid"));
        data.setSelected(jsonObj.getBoolean("isSelected"));
        data.setSystemApp(jsonObj.getBoolean("isSystemApp"));
        data.setFav(jsonObj.getBoolean("isFav"));
        lstExtrextData.add(data);
    }
} catch (JSONException e) {
    e.printStackTrace();
}

size PoJo sınıf nesnesinin listesini döndürür.


1

Java 8 stili

   JSONArray data = jsonObject.getJSONArray("some-node");

   List<JSONObject> list = StreamSupport.stream(data.spliterator(), false)
                .map(e -> (JSONObject)e)
                .collect(Collectors.toList());

0
public static List<JSONObject> getJSONObjectListFromJSONArray(JSONArray array) 
        throws JSONException {
  ArrayList<JSONObject> jsonObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           jsonObjects.add(array.getJSONObject(i++))
       );
  return jsonObjects;
}

0

Hızlı bir çözümüm var. Sadece bir dosya oluşturunArrayUtil.java

ObjectMapper mapper = new ObjectMapper(); 
List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));

Kullanım:

ArrayList<Object> list = ArrayUtil.convert(jArray);

veya

JSONArray jArr = ArrayUtil.convert(list);

0

Genel varyant

public static <T> List<T> getList(JSONArray jsonArray) throws Exception {

    List<T> list = new ArrayList<>(jsonArray.length());

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

        list.add((T)jsonArray.get(i));
    }

    return list;

}

//Usage

List<String> listKeyString = getList(dataJsonObject.getJSONArray("keyString"));

0
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
 listdata.addAll(jArray);
}

@basitleştirilmiş


0

Konunun orijinal konusuna bakalım:

jsonarray'i listeye dönüştürme (burada jackson jsonarray ve object mapper kullanılmıştır):

ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray();
array.put("IND");
array.put("CHN");
List<String> list = mapper.readValue(array.toString(), List.class);

0

Daha basit bir Java 8 alternatifi:

JSONArray data = new JSONArray(); //create data from this -> [{"thumb_url":"tb-1370913834.jpg","event_id":...}]

List<JSONObject> list = data.stream().map(o -> (JSONObject) o).collect(Collectors.toList());
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.