8

サンプルの JSON 入力は次のとおりです。

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

field を考えてみましょう。現在の"InputHiveTable"ように、すべて大文字INPUTHIVETABLE、すべて小文字inputhivetable、または両方の混合である可能性があります。

現在、私は次のようにフィールドを読んでいます(Javaで):

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

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

4

3 に答える 3

19

この大文字と小文字を区別しないルックアップを何度も実行する必要がある場合は、そのルックアップを行うメソッドを記述します。

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;

}
于 2013-08-05T22:46:07.380 に答える
2

TreeMap を使用して (つまり、String.CASE_INSENSITIVE_ORDERコンパレーターを介して) 大文字と小文字を区別しない場合、おそらく次のようにすることができます。

  1. メソッドが の静的メソッドを呼び出し、 と同じシグネチャと必要なすべてのインターフェイスを使用する独自のMyJSONObject拡張を実装します。デフォルトコンストラクタで書くTreeMapJSONObjectJSONObjectsuper(String.CASE_INSENSITIVE_ORDER)

  2. の新しいインスタンスを返す(そして単に newを返す)ContainerFactoryインターフェースを実装します。createObjectContainerMyJSONObjectcreateArrayContainerJSONArray

  3. 新しいコンテナで実行するにはMyContainerFactory

     StringReader in = new StringReader(yourJSONString);                    
     JSONParser parser = new JSONParser();      
     parser.parse(in, yourContainerFactory)
    
于 2013-08-05T21:27:58.563 に答える
1

JSONObject を Java 文字列に読み込み、その上で String.toLowerCase を呼び出して、JSONObject に格納し直すことができます。これにより、文字列の大文字と小文字がすべて小文字に変換されるため、ロジックの他の場所でそれを考慮する必要があります。その後、「inputhivetable」で get 呼び出しを実行するだけです。

決してきれいな解決策ではありませんが、JSON 入力として返されるものを処理する方法が他にまったくない場合は、回避策になる可能性があります。

于 2013-08-05T20:33:18.147 に答える