2012-08-29 20 views
17

Tôi muốn phân tích cú pháp mảng Json của mình theo cách động. và muốn lấy mảng KEYS cho mỗi phần tử dưới jsonarray. tôi nhận được điều này thông qua trình lặp. nhưng không nhận được sequeance theo json formate đầu ra.lấy mảng KEYS cho từng phần tử dưới jsonarray

JSON format của tôi:

{ 
    "result": "Success", 
    "AlertDetails": [ 
    { 
     "ShipmentNumber": "SHP34", 
     "Customer": "BEST", 
     "DateCreated": "2012-08-29T04:59:18Z" 
     "CustomerName": "BEST" 
    }, 
    { 
     "ShipmentNumber": "SHP22", 
     "Customer": "BEST", 
     "DateCreated": "2012-08-29T05:34:18Z" 
     "CustomerName": "Jelly" 
    } 
    ] 
} 

đây là Mã của tôi:

JSONArray array = jsonobject.getJSONArray("AlertDetails"); 

    JSONObject keyarray = array.getJSONObject(0); 
    Iterator temp = keyarray.keys(); 
     while (temp.hasNext()) { 
        String curentkey = (String) temp.next(); 
        KEYS.add(curentkey); 

    } 
Log.d("Parsing Json class", " ---- KEYS---- " + KEYS); 

gì tôi đang nhận được ở đầu ra logcate:

---- KEYS---- [DateCreated,CustomerName, Customer, ShipmentNumber] 

gì tôi muốn:

---- KEYS---- [ShipmentNumber, Customer, DateCreated,CustomerName] 
+0

là KEYS một arrayList? –

+0

@LazyNinja không chỉ là một cái tên. –

+0

@LazyNinja Có nó là một danh sách. bạn có thể giúp tôi thoát khỏi điều này không? sẽ là tuyệt vời nếu bạn cho tôi đề xuất cho vấn đề này. –

Trả lời

12

Các tài liệu JSONObject (link: http://developer.android.com/reference/org/json/JSONObject.html) đã mô tả sau đây cho keys() chức năng:

phím Iterator công cộng()

Từ: Cấp API 1

Trả về trình lặp của tên chuỗi trong đối tượng này. Trình quay vòng trả lại hỗ trợ xóa, thao tác này sẽ xóa ánh xạ tương ứng khỏi đối tượng này. Nếu đối tượng này được sửa đổi sau khi trình vòng lặp là được trả về, hành vi của trình lặp là không xác định. Thứ tự của các phím không được xác định.

Vì vậy, bạn có thể nhận được khóa nhưng đơn đặt hàng không được xác định. Bạn có thể sử dụng bất kỳ thuật toán sắp xếp nào nếu bạn muốn các khóa theo bất kỳ thứ tự cụ thể nào.

EDIT

Vì bạn là không biết gì về thứ tự của KEYS bạn đang nhận được từ WS, sau khi nhận được dữ liệu bạn có thể hiển thị các chi tiết trên màn hình trong một định dạng đặt hàng. Sau khi xây dựng các arraylistKEYS, bạn có thể sắp xếp nó theo thứ tự abc bằng cách sử dụng sau đây:

Collections.sort(KEYS); 

này sẽ ra lệnh cho Strings trong KEYSarraylist theo trật tự tự nhiên của nó (đó là theo thứ tự abc ).

+1

Thnx để được hỗ trợ của bạn. bạn có thể gợi ý cho tôi bất kỳ thuật toán nào để giải quyết vấn đề này và có thể cho tôi danh sách Arraylist có cùng thứ tự KEYS mà tôi nhận được trong phản hồi từ WS không? –

3

Ngoài ra còn có phương pháp names();

Trả về một mảng chứa tên chuỗi trong đối tượng này.

Chỉnh sửa: trả về tên theo thứ tự chưa xác định.Gợi ý: phân tích nó trên của riêng

+0

có bạn đúng.i cũng đã thử nó nhưng đó cũng là đem lại cho tôi thứ tự không xác định của các phím mà tôi đang nhận được bằng cách sử dụng phương thức key(). sẽ rất tuyệt vời nếu bạn có bất kỳ Đề xuất nào khác để giải quyết vấn đề này. –

+0

Sau đó, tôi sẽ đề nghị bạn phân tích nó trên của riêng bạn –

6

Tôi chỉ đến để nhận biết khi tôi nhấn ctlr + không gian thanh, trong đó nó ghi rõ rằng hành vi của các phím là undefined, đơn đặt hàng không được duy trì bởi phím của bạn.

enter image description here

Arun George nói @ một cách chính xác rằng bạn cần phải sử dụng bất kỳ phương pháp sắp xếp để đạt được mục tiêu của bạn.

và để sắp xếp có thể là link này sẽ giúp bạn.

+5

Điều này nên là một bình luận để trả lời của George ... và không phải là một câu trả lời .. – MKJParekh

4

Sử dụng thư viện khác để phân tích cú pháp json động.

Dưới đây tôi đã viết một đoạn mã dựa trên Jackson JSON Processor, đó là thư viện JSON tốt nhất theo ý kiến ​​của tôi

public void test() throws IOException { 
    String str = "{\n" + 
      " \"result\": \"Success\",\n" + 
      " \"AlertDetails\": [\n" + 
      " {\n" + 
      "  \"ShipmentNumber\": \"SHP34\",\n" + 
      "  \"Customer\": \"BEST\",\n" + 
      "  \"DateCreated\": \"2012-08-29T04:59:18Z\",\n" + 
      "  \"CustomerName\": \"BEST\"\n" + 
      " }\n" + 
      " ]\n" + 
      "}"; 

    JsonFactory factory = new JsonFactory(); 
    JsonParser jsonParser = factory.createJsonParser(str); 

    JsonToken jsonToken; 
    SerializedString alertDetails = new SerializedString("AlertDetails"); 
    while (!jsonParser.nextFieldName(alertDetails)) { /* move to AlertDetails field */ } 

    jsonParser.nextToken(); // skip [ start array 
    jsonParser.nextToken(); // skip { start object 
    // until } end object 
    while ((jsonToken = jsonParser.nextToken()) != JsonToken.END_OBJECT) { 
     if (jsonToken == JsonToken.FIELD_NAME) { 
      System.out.println(jsonParser.getCurrentName()); 
     } 
    } 

} 

Nó chỉ đơn giản in ra tên trường theo thứ tự như trong json:

ShipmentNumber 
Customer 
DateCreated 
CustomerName 

EDIT

Đương nhiên bạn có thể sử dụng các thư viện khác như gson vv Nhưng hãy nhớ rằng, như được viết trên json.org, rằng:

Một đối tượng là một hổn độn của các cặp tên/giá trị.

và thứ tự khóa phụ thuộc vào việc triển khai và có thể thay đổi theo từng yêu cầu.

6

Sử dụng GSON thư viện từ google. Nó có rất nhiều thiết lập để đọc/tạo/phân tích các mảng json và các đối tượng json. Tôi đã không kiểm tra nó để tìm ra giải pháp, nhưng tôi nghĩ nó rất đơn giản và đầy đủ tính năng công cụ và có thể giải quyết vấn đề.