ฉันจะได้รับ JSON Object หรือ Array จากเซิร์ฟเวอร์ แต่ฉันไม่รู้ว่าจะเป็นอย่างไร ฉันต้องทำงานกับ JSON แต่ในการทำเช่นนั้นฉันต้องรู้ว่ามันเป็น Object หรือ Array
ฉันกำลังทำงานกับ Android
ใครมีวิธีที่ดีในการทำเช่นนี้หรือไม่?
ฉันจะได้รับ JSON Object หรือ Array จากเซิร์ฟเวอร์ แต่ฉันไม่รู้ว่าจะเป็นอย่างไร ฉันต้องทำงานกับ JSON แต่ในการทำเช่นนั้นฉันต้องรู้ว่ามันเป็น Object หรือ Array
ฉันกำลังทำงานกับ Android
ใครมีวิธีที่ดีในการทำเช่นนี้หรือไม่?
คำตอบ:
ฉันพบวิธีที่ดีกว่าในการพิจารณา:
String data = "{ ... }";
Object json = new JSONTokener(data).nextValue();
if (json instanceof JSONObject)
//you have an object
else if (json instanceof JSONArray)
//you have an array
tokenizer สามารถส่งคืนประเภทต่างๆได้มากขึ้น: http://developer.android.com/reference/org/json/JSONTokener.html#nextValue ()
JSONTokener
ของคุณโดยใช้ ผมไม่ได้ทำอย่างนั้น แต่ฉันคิดว่าคุณควรskipPast ( "your_key") แต่ผมไม่แน่ใจ อย่างไรก็ตามคุณควรพิจารณาใช้ json mapper: Gson, Jackson, Moshi และอื่น ๆ อีกมากมาย
มีสองวิธีที่คุณสามารถทำได้:
{
คุณกำลังติดต่อกับ a JSONObject
ถ้าเป็น[
คุณกำลังติดต่อกับไฟล์JSONArray
.Object
) คุณสามารถinstanceof
ตรวจสอบได้ yourObject instanceof JSONObject
. สิ่งนี้จะส่งคืนจริงหาก yourObject เป็น JSONObject เช่นเดียวกับ JSONArrayนี่เป็นวิธีง่ายๆที่ฉันใช้บน Android:
JSONObject json = new JSONObject(jsonString);
if (json.has("data")) {
JSONObject dataObject = json.optJSONObject("data");
if (dataObject != null) {
//Do things with object.
} else {
JSONArray array = json.optJSONArray("data");
//Do things with array
}
} else {
// Do nothing or throw exception if "data" is a mandatory field
}
json.has("data")
สมมติว่าทุกอย่างเป็นทางเลือก (ไม่ได้ขอ)
นำเสนออีกวิธีหนึ่ง:
if(server_response.trim().charAt(0) == '[') {
Log.e("Response is : " , "JSONArray");
} else if(server_response.trim().charAt(0) == '{') {
Log.e("Response is : " , "JSONObject");
}
นี่server_response
คือสตริงการตอบกลับที่มาจากเซิร์ฟเวอร์
วิธีการพื้นฐานเพิ่มเติมในการดำเนินการดังต่อไปนี้
JsonArray
เป็นรายการโดยเนื้อแท้
JsonObject
เป็นแผนที่โดยเนื้อแท้
if (object instanceof Map){
JSONObject jsonObject = new JSONObject();
jsonObject.putAll((Map)object);
...
...
}
else if (object instanceof List){
JSONArray jsonArray = new JSONArray();
jsonArray.addAll((List)object);
...
...
}
อินสแตนซ์ของ
Object.getClass (). getName ()
สำหรับผู้ที่แก้ไขปัญหานี้ใน JavaScript สิ่งต่อไปนี้ได้ผลสำหรับฉัน (ไม่แน่ใจว่ามีประสิทธิภาพเพียงใด)
if(object.length != undefined) {
console.log('Array found. Length is : ' + object.length);
} else {
console.log('Object found.');
}
แนวทางของฉันจะเป็นนามธรรมทั้งหมดจากสิ่งนี้ อาจมีคนพบว่าสิ่งนี้มีประโยชน์ ...
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class SimpleJSONObject extends JSONObject {
private static final String FIELDNAME_NAME_VALUE_PAIRS = "nameValuePairs";
public SimpleJSONObject(String string) throws JSONException {
super(string);
}
public SimpleJSONObject(JSONObject jsonObject) throws JSONException {
super(jsonObject.toString());
}
@Override
public JSONObject getJSONObject(String name) throws JSONException {
final JSONObject jsonObject = super.getJSONObject(name);
return new SimpleJSONObject(jsonObject.toString());
}
@Override
public JSONArray getJSONArray(String name) throws JSONException {
JSONArray jsonArray = null;
try {
final Map<String, Object> map = this.getKeyValueMap();
final Object value = map.get(name);
jsonArray = this.evaluateJSONArray(name, value);
} catch (Exception e) {
throw new RuntimeException(e);
}
return jsonArray;
}
private JSONArray evaluateJSONArray(String name, final Object value) throws JSONException {
JSONArray jsonArray = null;
if (value instanceof JSONArray) {
jsonArray = this.castToJSONArray(value);
} else if (value instanceof JSONObject) {
jsonArray = this.createCollectionWithOneElement(value);
} else {
jsonArray = super.getJSONArray(name);
}
return jsonArray;
}
private JSONArray createCollectionWithOneElement(final Object value) {
final Collection<Object> collection = new ArrayList<Object>();
collection.add(value);
return (JSONArray) new JSONArray(collection);
}
private JSONArray castToJSONArray(final Object value) {
return (JSONArray) value;
}
private Map<String, Object> getKeyValueMap() throws NoSuchFieldException, IllegalAccessException {
final Field declaredField = JSONObject.class.getDeclaredField(FIELDNAME_NAME_VALUE_PAIRS);
declaredField.setAccessible(true);
@SuppressWarnings("unchecked")
final Map<String, Object> map = (Map<String, Object>) declaredField.get(this);
return map;
}
}
และตอนนี้กำจัดพฤติกรรมนี้ไปตลอดกาล ...
...
JSONObject simpleJSONObject = new SimpleJSONObject(jsonObject);
...