มีวิธีแปลง JSON Array เป็น Java Array ปกติสำหรับ Android การผูกข้อมูล ListView หรือไม่
มีวิธีแปลง JSON Array เป็น Java Array ปกติสำหรับ Android การผูกข้อมูล ListView หรือไม่
คำตอบ:
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());
}
}
jsonArray.get(i)
ผลตอบแทนเป็นโมฆะ (เป็นผลมาจากการแยกนี้[ "String 1", null, "String 2" ]
)? ฟอร์ลูปของคุณจะไม่พังเหรอ?
size()
length()
หากคุณยังไม่มีออบเจ็กต์ 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) );
}
แทนที่จะใช้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);
อาจเป็นเพียงวิธีแก้ปัญหา (ไม่ค่อยมีประสิทธิภาพ) แต่คุณสามารถทำสิ่งนี้ได้:
String[] resultingArray = yourJSONarray.join(",").split(",");
เห็นได้ชัดว่าคุณสามารถเปลี่ยนตัว,
คั่น '' ด้วยอะไรก็ได้ที่คุณต้องการ (ฉันมีJSONArray
ที่อยู่อีเมล)
การใช้งานสามารถใช้ a String[]
แทนArrayList<String>
:
มันจะลดค่าใช้จ่ายของหน่วยความจำที่ ArrayList มี
หวังว่าจะช่วยได้!
String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
parametersArray[i] = parametersJSONArray.getString(i);
}
การใช้ 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());
ฉันรู้ว่าคำถามนั้นเกี่ยวกับ 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);
}
}
ใช้งานได้กับอาร์เรย์ของสตริง
นี่คือวิธีที่ดีกว่าในการทำเช่นนี้: หากคุณได้รับข้อมูลจาก 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();
...
เราเริ่มต้นจากการแปลง [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;
}
คุณสามารถใช้ 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;
}
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;
}
เราสามารถแปลง 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("\",\"");
Java
ฉันรู้ว่าคำถามคือ แต่ฉันต้องการแบ่งปันวิธีแก้ปัญหาที่เป็นไปได้สำหรับKotlin
เพราะฉันคิดว่ามันมีประโยชน์
ด้วย Kotlin คุณสามารถเขียนฟังก์ชันส่วนขยายซึ่งแปลง a JSONArray
เป็นอาร์เรย์ดั้งเดิม (Kotlin):
fun JSONArray.asArray(): Array<Any> {
return Array(this.length()) { this[it] }
}
ตอนนี้คุณสามารถโทรasArray()
ได้โดยตรงบนJSONArray
อินสแตนซ์
วิธีการใช้ java.util.Arrays
List<String> list = Arrays.asList((String[])jsonArray.toArray())
toArray()
วิธีการในJSONArray()
เอกสาร json.org/javadoc/org/json/JSONArray.htmlคำถามนี้อาจไม่มีใครถามว่ามีวิธีง่ายๆtoArray()
หรือไม่
org.JSONArray
ใช้ ArrayList ภายใต้ประทุน ...The arrayList where the JSONArray's properties are kept
ดังนั้นการวนซ้ำส่วนใหญ่จึงไม่ทำอะไรเลยในหลาย ๆ กรณี (สำหรับการห่อหุ้ม)