แปลง Json Array เป็นรายการ Java ปกติ


130

มีวิธีแปลง JSON Array เป็น Java Array ปกติสำหรับ Android การผูกข้อมูล ListView หรือไม่


8
สิ่งที่ตลกคือorg.JSONArrayใช้ ArrayList ภายใต้ประทุน ... The arrayList where the JSONArray's properties are keptดังนั้นการวนซ้ำส่วนใหญ่จึงไม่ทำอะไรเลยในหลาย ๆ กรณี (สำหรับการห่อหุ้ม)
Christophe Roussy

คำตอบ:


186
ArrayList<String> list = new ArrayList<String>();     
JSONArray jsonArray = (JSONArray)jsonObject; 
if (jsonArray != null) { 
   int len = jsonArray.length();
   for (int i=0;i<len;i++){ 
    list.add(jsonArray.get(i).toString());
   } 
} 

5
สำหรับลูปไม่มีวงเล็บปิด ... พยายามแก้ไข แต่มีอักขระไม่เพียงพอที่จะผ่านการอนุมัติ โอ้ดี! แค่ FYI
Matt K

itz ไม่ได้หายไปจริงๆผู้ตอบเพียงแค่วางโค้ดส่วนหนึ่งด้วยวงเล็บปีกกาเปิดและปิดของฟังก์ชัน
Sarim Javaid Khan

1
เกิดอะไรขึ้นหากjsonArray.get(i)ผลตอบแทนเป็นโมฆะ (เป็นผลมาจากการแยกนี้[ "String 1", null, "String 2" ])? ฟอร์ลูปของคุณจะไม่พังเหรอ?
dbm

ขอบคุณ หากมี sring แล้ว JSONArray สามารถสร้างเป็น JSONArray jsonArray = JSONArray ใหม่ (yourString); ส่วนที่เหลือของรหัสจะยังคงเหมือนเดิม
Kaushik Lele

ทั้งนี้ขึ้นอยู่กับการดำเนินการที่คุณอาจต้องแทนsize() length()
Guillaume F.

57

หากคุณยังไม่มีออบเจ็กต์ JSONArray ให้โทร

JSONArray jsonArray = new JSONArray(jsonArrayString);

จากนั้นก็วนซ้ำสร้างอาร์เรย์ของคุณเอง โค้ดนี้ถือว่าเป็นอาร์เรย์ของสตริงไม่ควรยากที่จะแก้ไขให้เหมาะกับโครงสร้างอาร์เรย์ของคุณโดยเฉพาะ

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

2
ขออภัยคุณพูดถูก - ฉันสับสน Lists กับ JSONArrays :) มันเป็น JSONArray.length () จริงๆ
นิค

13

แทนที่จะใช้org.jsonไลบรารีที่แถมมาให้ลองใช้ Jackson หรือ GSON ซึ่งเป็นซับเดียว กับ Jackson, f.ex:

List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);

11

อาจเป็นเพียงวิธีแก้ปัญหา (ไม่ค่อยมีประสิทธิภาพ) แต่คุณสามารถทำสิ่งนี้ได้:

String[] resultingArray = yourJSONarray.join(",").split(",");

เห็นได้ชัดว่าคุณสามารถเปลี่ยนตัว,คั่น '' ด้วยอะไรก็ได้ที่คุณต้องการ (ฉันมีJSONArrayที่อยู่อีเมล)


8
โปรดทราบว่าคุณต้องแน่ใจอย่างยิ่งว่าข้อมูลไม่มีถ่านตัวคั่นของคุณมิฉะนั้นคุณจะพบข้อมูลเสียหาย
Artemix

1
และผลลัพธ์จะต้องเป็นสตริง
Nicolas Tyler

ซับเดียวเพอร์เฟค
zeeshan

4

การใช้งานสามารถใช้ a String[]แทนArrayList<String>:

มันจะลดค่าใช้จ่ายของหน่วยความจำที่ ArrayList มี

หวังว่าจะช่วยได้!

String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
    parametersArray[i] = parametersJSONArray.getString(i);
}

3

การใช้ Java Streams คุณสามารถใช้การIntStreamแมปวัตถุ:

JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
        .mapToObj(array::get)
        .map(Object::toString)
        .collect(Collectors.toList());

0

ฉันรู้ว่าคำถามนั้นเกี่ยวกับ JSONArray แต่นี่คือตัวอย่างที่ฉันพบว่ามีประโยชน์โดยที่คุณไม่จำเป็นต้องใช้ JSONArray เพื่อแยกวัตถุจาก JSONObject

import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

String jsonStr = "{\"types\":[1, 2]}";
JSONObject json = (JSONObject) JSONValue.parse(jsonStr);
List<Long> list = (List<Long>) json.get("types");
if (list != null) {
    for (Long s : list) {
        System.out.println(s);
    }
}

ใช้งานได้กับอาร์เรย์ของสตริง


0

นี่คือวิธีที่ดีกว่าในการทำเช่นนี้: หากคุณได้รับข้อมูลจาก API จากนั้นแยก JSON และโหลดลงใน listview ของคุณ:

protected void onPostExecute(String result) {
                Log.v(TAG + " result);


                if (!result.equals("")) {

                    // Set up variables for API Call
                    ArrayList<String> list = new ArrayList<String>();

                    try {
                        JSONArray jsonArray = new JSONArray(result);

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

                            list.add(jsonArray.get(i).toString());

                        }//end for
                    } catch (JSONException e) {
                        Log.e(TAG, "onPostExecute > Try > JSONException => " + e);
                        e.printStackTrace();
                    }


                    adapter = new ArrayAdapter<String>(ListViewData.this, android.R.layout.simple_list_item_1, android.R.id.text1, list);
                    listView.setAdapter(adapter);
                    listView.setOnItemClickListener(new OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                            // ListView Clicked item index
                            int itemPosition = position;

                            // ListView Clicked item value
                            String itemValue = (String) listView.getItemAtPosition(position);

                            // Show Alert
                            Toast.makeText( ListViewData.this, "Position :" + itemPosition + "  ListItem : " + itemValue, Toast.LENGTH_LONG).show();
                        }
                    });

                    adapter.notifyDataSetChanged();


                        adapter.notifyDataSetChanged();

...

0

เราเริ่มต้นจากการแปลง [JSONArray -> รายการ <JSONObject>]

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

ถัดไปสร้างเวอร์ชันทั่วไปแทนที่ array.getJSONObject (i ++) ด้วย POJO

ตัวอย่าง:

public <T> static List<T> getJSONObjectListFromJSONArray(Class<T> forClass, JSONArray array) 
        throws JSONException {
  ArrayList<Tt> tObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           tObjects.add( (T) createT(forClass, array.getJSONObject(i++))) 
       );
  return tObjects;
}

private static T createT(Class<T> forCLass, JSONObject jObject) {
   // instantiate via reflection / use constructor or whatsoever 
   T tObject = forClass.newInstance(); 
   // if not using constuctor args  fill up 
   // 
   // return new pojo filled object 
   return tObject;
}

0

คุณสามารถใช้ a String[]แทนArrayList<String>:

หวังว่าจะช่วยได้!

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }

0

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }


0

เราสามารถแปลง JSON เป็นสตริงที่อ่านได้และแยกโดยใช้วิธี "แยก" ของคลาส String

String jsonAsString = yourJsonArray.toString();
//we need to remove the leading and the ending quotes and square brackets
jsonAsString = jsonAsString.substring(2, jsonAsString.length() -2);
//split wherever the String contains ","
String[] jsonAsStringArray = jsonAsString.split("\",\"");

-2

Javaฉันรู้ว่าคำถามคือ แต่ฉันต้องการแบ่งปันวิธีแก้ปัญหาที่เป็นไปได้สำหรับKotlinเพราะฉันคิดว่ามันมีประโยชน์

ด้วย Kotlin คุณสามารถเขียนฟังก์ชันส่วนขยายซึ่งแปลง a JSONArrayเป็นอาร์เรย์ดั้งเดิม (Kotlin):

fun JSONArray.asArray(): Array<Any> {
    return Array(this.length()) { this[it] }
}

ตอนนี้คุณสามารถโทรasArray()ได้โดยตรงบนJSONArrayอินสแตนซ์


-3

วิธีการใช้ java.util.Arrays

List<String> list = Arrays.asList((String[])jsonArray.toArray())

15
ฉันไม่เห็นtoArray()วิธีการในJSONArray()เอกสาร json.org/javadoc/org/json/JSONArray.htmlคำถามนี้อาจไม่มีใครถามว่ามีวิธีง่ายๆtoArray()หรือไม่
javajavajavajavajava

1
net.sf.json.JSONArray มีเมธอด toArray () ดังนั้นการตอบสนองนี้จึงใช้ได้กับไลบรารี JSON นี้ คำถามไม่ได้ระบุไลบรารีที่ใช้
ilinca
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.