2013-08-05 15 views
6

Moja próbka wejścia JSON jest następujący:Jak zignorować przypadek, szukając obiekt JSON

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

Rozważmy pole "InputHiveTable", to może być w całości wielkimi literami INPUTHIVETABLE, wszystkie małe inputhivetable, lub mieszanina zarówno jako to jest teraz.

Obecnie czytam boiska w następujący sposób (w Javie):

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

Więc moje pytanie brzmi: w jaki sposób mogę szukać dziedzinie "InputHiveTable" ignorując sprawę. Używam prostych bibliotek JSON.

Odpowiedz

14

Jeśli trzeba wykonać ten przypadek-niewrażliwe Lookup wiele razy, to bym po prostu napisać metodę zrobić tego odnośnika:

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

JSONObject jest zaimplementowany jako HashMap

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

jako takie, nie ma sposobu, aby zignorować sprawę klucza String gdy próbuje odzyskać swoją odwzorowaną wartość. Będziesz musiał wymyślić jakieś zasady dotyczące generowania tego JSON-a.

0

Możesz odczytywać JSONObject w łańcuchu java i wywoływać na nim String.toLowerCase i przechowywać go z powrotem w obiekcie JSONObject. Spowoduje to przekształcenie całego przypadku łańcucha znaków na małe litery, więc będziesz musiał uwzględnić to w innym miejscu swojej logiki. Potem wystarczy wykonać wywołanie "inputhivetable".

Pod żadnym pozorem nie jest to ładne rozwiązanie, ale jest to potencjalna praca, jeśli nie ma absolutnie żadnego innego sposobu, aby poradzić sobie z tym, co wracasz jako wejście JSON.

+2

To miałoby wyraźną wadę niższej obudowy wartości, a także kluczy. Wydaje się, że nie ma łatwego sposobu na dopasowywanie bez względu na wielkość liter tylko na samych klawiszach, bez zwiększania ochoty, na przykład na powtarzanie kluczy lub zmienianie parsera. – BobDoolittle

+0

Czy zadanie, gdy formatowanie wartości nie jest ważne. W moim przypadku wszystkie moje wartości to liczby. –

1

Biorąc pod uwagę, że sprawa-niewrażliwość można osiągnąć TreeMap (tj poprzez String.CASE_INSENSITIVE_ORDER porównawczym), prawdopodobnie można wykonać następujące czynności:

  1. zaimplementować własną MyJSONObject rozszerzenie TreeMap gdzie jego metody będą po prostu wywołanie metody statyczne z JSONObject z tymi samymi sygnaturami i wszystkimi wymaganymi interfejsami, jak w JSONObject. W domyślnego konstruktora napisać super(String.CASE_INSENSITIVE_ORDER)

  2. Wdrożenie ContainerFactory interfejs gdzie createObjectContainer powróci nową instancję MyJSONObject (i createArrayContainer po prostu wrócić nowy JSONArray).

  3. Aby uruchomić go z nowego pojemnika MyContainerFactory:

    StringReader in = new StringReader(yourJSONString);      
    JSONParser parser = new JSONParser();  
    parser.parse(in, yourContainerFactory)