2013-08-05 10 views
6

次のように私のサンプルJSON入力は次のとおりです。JSONオブジェクトを検索するときにケースを無視する方法

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

フィールド"InputHiveTable"を考えてみましょう、それはすべて大文字INPUTHIVETABLEに可能性があり、すべて小文字inputhivetable、またはその両方の混合物としてそれは今です。次のように

現在、私は(Javaで)フィールドを読んでいる:

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

だから私の質問は、ケースを無視して、私はフィールド"InputHiveTable"を検索するにはどのようです。 私はJSON Simpleライブラリを使用しています。

答えて

14

:新しいコンテナMyContainerFactoryでそれを実行するには

  • 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は、このようにハッシュマップ

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

    として実装され、そのマッピングされた値を取得しようとする文字列のキーの場合を無視する方法はありません。そのJSONを生成する方法についていくつかのルールを考えなければなりません。

    0

    JSONObjectをJava文字列に読み込んで、String.toLowerCaseを呼び出してJSONObjectに戻すことができます。これは、文字列の大文字小文字を小文字に変換するので、ロジック内の別の場所を考慮する必要があります。その後、 "inputhivetable"を呼び出すだけでよいでしょう。

    決してそれは素晴らしい解決策ではありませんが、あなたがJSON入力として返すものを処理するための他の方法がまったくない場合は、潜在的な回避策です。その場合、非感受性は、(String.CASE_INSENSITIVE_ORDERコンパレータ経由でIE)のTreeMapを達成することができる考える

    +2

    これは、値だけでなくキーも低いケーシングの明白な欠点があります。キーの反復処理やパーサの変更など、もっと面白くなることなく、キーだけで大文字小文字を区別しない一致を行う簡単な方法はないようです。 – BobDoolittle

    +0

    値の書式設定が重要でない場合のジョブを実行します。私の場合、私のすべての価値は数字です。 –

    1

    は、おそらく次の操作を実行できます。

    1. 独自01​​はその方法だけで静的メソッドを呼び出すことになるTreeMapを拡張実装しますJSONObjectと同じ署名とすべての必要なインターフェイスはJSONObjectと同じです。デフォルトコンストラクタでcreateObjectContainerMyJSONObjectの新しいインスタンスを返しますContainerFactoryインターフェース(およびcreateArrayContainerはちょうど新しいJSONArrayを返します)を実装しsuper(String.CASE_INSENSITIVE_ORDER)

    2. を書きます。あなたはこの大文字と小文字を区別しない検索を何度も実行する必要がある場合、私はちょうどその検索を行うための方法を記述します

      StringReader in = new StringReader(yourJSONString);      
      JSONParser parser = new JSONParser();  
      parser.parse(in, yourContainerFactory) 
      
    関連する問題