Xác định xem JSON là JSONObject hay JSONArray


132

Tôi sẽ nhận được một đối tượng JSON hoặc Array từ máy chủ, nhưng tôi không biết nó sẽ là gì. Tôi cần phải làm việc với JSON, nhưng để làm như vậy, tôi cần biết nó là Object hay Array.

Tôi đang làm việc với Android.

Có ai có một cách tốt để làm điều này?


Nếu sử dụng Gson với Android và khi nói đến việc giải thích một cách để làm điều đó là như thế này .
pirho

Câu trả lời:


244

Tôi tìm thấy cách tốt hơn để xác định:

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

mã thông báo có thể trả về nhiều loại hơn: http://developer.android.com/reference/org/json/JSONTokener.html#nextValue ()


1
công việc tốt. hy vọng nó sẽ kiểm tra cả JsonObject và Json Array
Shreyash Mahajan

2
@neworld nhưng nếu tôi ở giữa một vòng lặp. cố gắng lấy dữ liệu.getJSONArray () hoặc data.getJSONObject () sẽ có khả năng ném JSONEXception !!
P-RAD

Xin chào đối tượng của tôi là giữa phản ứng vì vậy làm thế nào tôi có thể phát hiện ra điều đó? để kiểm tra xem JSONObject hay JSONArray của nó ??? và Trong câu trả lời của bạn String data = "{...}"; là có giá trị của toàn bộ phản ứng ???
amit pandya

Để thực hiện điều đó, bạn phải phân tích cú pháp JSON của mình bằng cách sử dụng JSONTokener. Tôi đã không làm điều đó, nhưng tôi cho rằng bạn nên bỏ quaPast ("your_key") . Nhưng tôi không chắc chắn. Tuy nhiên, bạn nên cân nhắc sử dụng json mapper: Gson, Jackson, Moshi và tấn người khác.
newworld

53

Có một số cách bạn có thể làm điều này:

  1. Bạn có thể kiểm tra ký tự ở vị trí đầu tiên của Chuỗi (sau khi cắt bớt khoảng trắng, vì nó được phép trong JSON hợp lệ). Nếu là a {, bạn đang giao dịch với a JSONObject, nếu là a [, bạn đang giao dịch với a JSONArray.
  2. Nếu bạn đang làm việc với JSON (an Object), thì bạn có thể instanceofkiểm tra. yourObject instanceof JSONObject. Điều này sẽ trả về true nếu yourObject là JSONObject. Điều tương tự cũng áp dụng cho JSONArray.

3
Điều đó chắc chắn đã làm việc. Cuối cùng, tôi đã đặt chuỗi vào JSONObject và nếu nó gây ra lỗi, thì tôi biết đó là một JSONArray. thử {trả lại JSONObject mới (json); } Catch (Exception e) {} thử {return new JSONArray (json); } bắt (Ngoại lệ e) {}
Greg

3
Tùy chọn đầu tiên của bạn sẽ không hoạt động đáng tin cậy, vì khoảng trắng được cho phép khi bắt đầu dữ liệu JSON. Bạn cần bỏ qua mọi khoảng trắng hàng đầu và kiểm tra ký tự không phải khoảng trắng đầu tiên.
user9876

1
@ user9876 Cảm ơn vì đã ngẩng cao đầu. Chỉnh sửa để phản ánh bình luận của bạn.
nicholas.hauschild

14

Đây là giải pháp đơn giản tôi đang sử dụng trên 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
}

1
Không phải Android cụ thể và tôi thích phiên bản này nhất vì nó không sử dụng kiểm tra ký tự, nhưng json.has("data")giả sử toàn bộ là tùy chọn (không được yêu cầu).
Barshe Roussy

7

Trình bày một cách khác:

if(server_response.trim().charAt(0) == '[') {
    Log.e("Response is : " , "JSONArray");
} else if(server_response.trim().charAt(0) == '{') {
    Log.e("Response is : " , "JSONObject");
}

Đây server_responselà một chuỗi phản hồi đến từ máy chủ


1

Một cách cơ bản hơn để làm điều này là sau đây.

JsonArrayvốn dĩ là một Danh sách

JsonObjectvốn dĩ là một bản đồ

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

0

ví dụ

Object.getClass (). GetName ()


Tôi nghĩ rằng câu hỏi giả định rằng bạn sẽ làm việc với một chuỗi đơn giản vì vậy sử dụng instanceof hoặc getClass (). GetName () sẽ không hoạt động.
game thủ

@gamerson - Điều đó thật kỳ quặc - nó đã làm việc với tôi nhiều lần. Bạn chỉ cần có trình phân tích cú pháp trả về một trong hai đối tượng, so với chỉ định đó.
Hot Licks

1
Rõ ràng mọi người không hiểu điều này. Khá nhiều trình phân tích cú pháp mà tôi thấy có tùy chọn phân tích cú pháp để trả về "JSONInstance" hoặc đơn giản là "Đối tượng" hoặc bất cứ điều gì. Phân tích JSON và sau đó hỏi nó là gì. Một trình phân tích cú pháp không có khả năng này đã bị hỏng.
Hot Licks

(Trên thực tế, đây là câu trả lời của Newworld, ít nhiều.)
Hot Licks

0

Đối với những người giải quyết vấn đề này trong JavaScript, những điều sau đây đã giúp tôi làm việc (không chắc nó hiệu quả đến mức nào).

if(object.length != undefined) {
   console.log('Array found. Length is : ' + object.length); 
} else {
 console.log('Object found.'); 
}

-1

Cách tiếp cận của tôi sẽ là một sự trừu tượng hoàn toàn từ điều này. Có lẽ ai đó thấy điều này hữu ích ...

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


}

Và bây giờ thoát khỏi hành vi này mãi mãi ...

...
JSONObject simpleJSONObject = new SimpleJSONObject(jsonObject);
...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.