0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

クエリパラメータをキー名変換マップをもとにキー名を変更

Last updated at Posted at 2025-03-18

Java 17

方法1. 変換表のMapを宣言&設定(プログラム内でput)

変換後のキーと値のリストを List にまとめる。
String.join("&") を使って "key=value" のリストを結合。
LinkedHashMap を使うことで元の順序を維持。

Map<String, String> KEY_MAPPING = new HashMap<>();
KEY_MAPPING.put("oldKey1", "newKey1");
KEY_MAPPING.put("oldKey2", "newKey2");

String queryString = "oldKey1=value1&oldKey2=value2&otherKey=value3&oldKey1=value4";

if (StringUtils.isEmpty(queryString)) {
  // 文字列がnullか空文字の時は処理をしない
} else {
  // クエリ文字列をパースして変換
  Map<String, List<String>> convertedParams = new LinkedHashMap<>();

  // クエリ文字列を "&" で分割
  String[] pairs = queryString.split("&");

  for (String pair : pairs) {
      String[] keyValue = pair.split("=", 2);
      String oldKey = keyValue[0];
      String value = keyValue.length > 1 ? keyValue[1] : "";

      // 変換マップを使用してキー名を変更
      String newKey = KEY_MAPPING.getOrDefault(oldKey, oldKey);

      // 変換後のパラメータをマップに格納(リストで管理)
      convertedParams.computeIfAbsent(newKey, k -> new ArrayList<>()).add(value);
  }

  // 変換後のパラメータをクエリ文字列に戻す
  List<String> paramList = new ArrayList<>();

  for (Map.Entry<String, List<String>> entry : convertedParams.entrySet()) {
      String key = entry.getKey();
      for (String value : entry.getValue()) {
          paramList.add(key + "=" + value);
      }
  }

  String restoredQuery = String.join("&", paramList);

  System.out.println("restoredQuery: " + restoredQuery);
}

実行結果

restoredQuery: newKey1=value1&newKey1=value4&newKey2=value2&otherKey=value3

方法2. 変換表のMapを宣言&設定(プロパティファイルから読み込み)

src/main/resources/key_mapping.properties
oldKey1=newKey1
oldKey2=newKey2
Map<String, String> KEY_MAPPING = loadKeyMappings("key_mapping");

String queryString = "oldKey1=value1&oldKey2=value2&otherKey=value3&oldKey1=value4";

if (StringUtils.isEmpty(queryString)) {
  // 文字列がnullか空文字の時は処理をしない
} else {
  // クエリ文字列をパースして変換
  Map<String, List<String>> convertedParams = new LinkedHashMap<>();

  // クエリ文字列を "&" で分割
  String[] pairs = queryString.split("&");

  for (String pair : pairs) {
      String[] keyValue = pair.split("=", 2);
      String oldKey = keyValue[0];
      String value = keyValue.length > 1 ? keyValue[1] : "";

      // 変換マップを使用してキー名を変更
      String newKey = KEY_MAPPING.getOrDefault(oldKey, oldKey);

      // 変換後のパラメータをマップに格納(リストで管理)
      convertedParams.computeIfAbsent(newKey, k -> new ArrayList<>()).add(value);
  }

  // 変換後のパラメータをクエリ文字列に戻す
  List<String> paramList = new ArrayList<>();

  for (Map.Entry<String, List<String>> entry : convertedParams.entrySet()) {
      String key = entry.getKey();
      for (String value : entry.getValue()) {
          paramList.add(key + "=" + value);
      }
  }

  String restoredQuery = String.join("&", paramList);

  System.out.println("restoredQuery: " + restoredQuery);
}

private Map<String, String> loadKeyMappings(String baseName) {
    Map<String, String> keyMap = new HashMap<>();

    try {
        ResourceBundle bundle = ResourceBundle.getBundle(baseName);
        for (String key : bundle.keySet()) {
            String value = bundle.getString(key);
            
            if (StringUtils.isEmpty(value)) {
                throw new IllegalArgumentException("エラー: キー '" + key + "' の値が空です。プロパティファイルを修正してください。");
            }

            keyMap.put(key, value);
        }
    } catch (MissingResourceException e) {
        System.err.println("エラー: プロパティファイル '" + baseName + ".properties' が見つかりません。");
        throw e; // そのまま例外を投げて処理を中断
    }

    return keyMap;
}

実行結果

restoredQuery: newKey1=value1&newKey1=value4&newKey2=value2&otherKey=value3
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?