2013-08-05 41 views
6

mẫu JSON đầu vào của tôi là như sau:Làm thế nào để bỏ qua trường hợp khi tìm kiếm một đối tượng JSON

"JobName":"Test Job 1", 
"events":[ 
    { "features":[], 
     "InputHiveTable":"uilog_uiclientlogdata", 
     "eventColumn":"command", 
     "name":"edu.apollogrp.classroom.discussion.client.events.CreateDiscussionEvent" 
    }, 

xem xét lĩnh vực "InputHiveTable", nó có thể là trong tất cả các chữ hoa INPUTHIVETABLE, tất cả chữ thường inputhivetable, hoặc hỗn hợp của cả hai như nó bây giờ là.

Hiện nay, tôi đang đọc các lĩnh vực như sau (trong Java):

JSONObject jsonObject = (JSONObject) obj; 
JSONArray events = (JSONArray) jsonObject.get("events"); 
String InputHiveTable = (String)event.get("InputHiveTable"); 

Vì vậy, câu hỏi của tôi là làm thế nào để tìm kiếm các lĩnh vực "InputHiveTable" trong khi bỏ qua các trường hợp. Tôi đang sử dụng thư viện JSON đơn giản.

Trả lời

14

Nếu bạn phải thực hiện case-insensitive tra cứu này nhiều lần, tôi chỉ muốn viết một phương pháp để làm tra cứu rằng:

public Object getIgnoreCase(JSONObject jobj, String key) { 

    Iterator<String> iter = jobj.keySet().iterator(); 
    while (iter.hasNext()) { 
     String key1 = iter.next(); 
     if (key1.equalsIgnoreCase(key)) { 
      return jobj.get(key1); 
     } 
    } 

    return null; 

} 
1

Một JSONObject được thực hiện như một HashMap

public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAware{ 

Như vậy, không có cách nào để bỏ qua trường hợp của khóa String khi cố gắng để lấy giá trị ánh xạ của nó. Bạn sẽ phải đưa ra một số quy tắc về cách tạo JSON đó.

0

Bạn có thể đọc JSONObject thành chuỗi java và gọi String.toLowerCase trên đó và lưu nó trở lại thành JSONObject. Điều này sẽ biến toàn bộ trường hợp của chuỗi thành chữ thường, vì vậy bạn sẽ phải tính toán điều đó ở đâu đó trong logic của bạn. Sau đó, bạn sẽ phải thực hiện cuộc gọi trên "inputhivetable".

Không có nghĩa là nó là một giải pháp khá, nhưng nó là một công việc tiềm năng xung quanh nếu hoàn toàn không có cách nào khác để bạn xử lý những gì bạn đang quay trở lại làm đầu vào JSON của bạn.

+2

Điều đó sẽ có những bất lợi riêng biệt của các giá trị thấp hơn, cũng như các khóa. Dường như không có cách nào dễ dàng để thực hiện một trận đấu không phân biệt dạng chữ trên các phím một mình, mà không trở nên lạ mắt hơn như lặp qua các phím hoặc thay đổi trình phân tích cú pháp. – BobDoolittle

+0

Công việc khi định dạng các giá trị không quan trọng. Trong trường hợp của tôi, tất cả các giá trị của tôi là số. –

1

Cho rằng trường hợp vô cảm có thể đạt được với TreeMap (tức là qua String.CASE_INSENSITIVE_ORDER so sánh), bạn có thể làm như sau:

  1. Thực hiện của riêng MyJSONObject mở rộng TreeMap nơi phương pháp của nó sẽ được chỉ cần gọi phương pháp tĩnh của JSONObject có cùng chữ ký và tất cả các giao diện bắt buộc như trong JSONObject. Trong constructor mặc định viết super(String.CASE_INSENSITIVE_ORDER)

  2. Thực hiện giao diện ContainerFactory nơi createObjectContainer sẽ trở lại thể hiện mới của MyJSONObject (và createArrayContainer sẽ chỉ trả lại mới JSONArray).

  3. Để chạy nó với container mới MyContainerFactory:

    StringReader in = new StringReader(yourJSONString);      
    JSONParser parser = new JSONParser();  
    parser.parse(in, yourContainerFactory) 
    
Các vấn đề liên quan