Javaにおける構造文書上のパス配列を用いた値の発見方法


時々、我々はJSON(YAML)のような構造文書に値を見つける必要があります.また、ドキュメントのパスで値を見つける必要があります.
構造ドキュメントを簡単にパーサーライブラリでマップリストオブジェクトに変換することができます.そのため、キーとインデックス配列を使用してドキュメントの値を取得できます.
それをする.
まず、JSONまたはYAMLをJavaマップリスト構造に解析できるパーサーライブラリを取得する必要があります.そのライブラリは簡単にMaven本部のようなインターネットライブラリリポジトリで見つけることができます.
このポストのために、我々は我々がJSON文書を目標とすると仮定します.
下に
{
  "id": "0001",
  "type": "donut",
  "name": "Cake",
  "ppu": 0.55,
  "batters": {
    "aaa": {
      "bbb": {
        "ccc": {
          "value": 123.0
        }
      }
    },
    "batter": [
      {
        "id": "1001",
        "type": "Regular"
      },
      {
        "id": "1002",
        "type": "Chocolate"
      },
      {
        "id": "1003",
        "type": "Blueberry"
      },
      {
        "id": "1004",
        "type": "Devil\u0027s Food"
      }
    ]
  },
再帰的なアルゴリズムを使用して値を見つけ、パスが値を見つけられない場合やパスが存在しない場合はNULLを返します.
完了コードは下に
    /**
     * To find value with path array on structural data
     * 
     * @param obj
     * @param keys
     * @return
     */
    public static Object findValue(Object obj, Object[] keys) {
        if (obj instanceof List) {
            List list = (List) obj;
            if (keys.length == 1) {
                if (keys[0] instanceof Integer && list.size() > (int) keys[0]) {
                    return list.get((int) keys[0]);
                }
            } else if (keys.length > 1 && list.size() > 0) {
                int idx = (int)keys[0];
                if(idx < list.size()) {
                    return findValue(list.get((int) keys[0]), Arrays.copyOfRange(keys, 1, keys.length));
                }
            }
        } else if (obj instanceof Map) {
            Map map = (Map) obj;
            if (keys.length == 1 && map.containsKey(keys[0])) {
                return map.get(keys[0]);
            } else if (keys.length > 1 && map.containsKey(keys[0])) {
                if(keys.length > 0) {
                    return findValue(map.get(keys[0]), Arrays.copyOfRange(keys, 1, keys.length));
                }
            }
        }
        return null;
    }
さて、今テストを始めましょう
上記のJSONドキュメントの上に保存します.JSON
コードの下にサンプルが読み込まれます.JSON 'と結果は以下のイメージです.
Gson gson = new Gson();
Map<String, Object> map = gson.fromJson(new FileReader("simple.json"), Map.class);
Object[] keys = new Object[] {"batters", "batter", 3, "type"};

Object obj = findValue(map, keys);
System.out.println(obj);