あなたの質問には暗示的な部分がいくつかあり、どこで問題が発生しているのか明確ではありません。
- JSON 文字列を取得して、そこから使用可能な Java オブジェクトを作成するにはどうすればよいですか。(質問に「java」のタグを付けたので、JavaScriptではなくJavaを想定しています。)
- それらが作られた後、それらのオブジェクトをどのように分類しますか?
- ネストされたパーツのソートをどのように処理しますか? (あなたの例では、「idx-server」にはサブテナントがあります。)
これのどの部分に問題があるのか 正確にはわからないので、3つすべてについていくつかのメモを以下に示します.
パート 1: Java オブジェクトの取得
私は、ジャクソンが使用するのに適した JSON パーサーであるという他の人に同意します。以下は、JSON を解析するために使用できる数行のコードです。
String jsonString = "..."; // Load this in whatever way makes sense for you
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> parsedJson = mapper.readValue(jsonString, Map.class);
JSON 文字列が非常に大きい場合は、文字列readValue
全体をメモリに読み込まないようにするために使用できる他のオーバーロードがあります。
パート 2: Java オブジェクトのソート
解析された JSON を取得したら、並べ替えは を呼び出して配列Collections.sort(...)
を渡すだけです。さらに、必要な順序を定義するComparatortenants
を作成する必要があります。たとえば、名前でソートするコンパレータは次のとおりです。
public class NameComparator implements Comparator<Map<String,Object>> {
public int compare(Map<String,Object> o1, Map<String,Object> o2) {
String name1 = (String) o1.get("name");
String name2 = (String) o2.get("name");
return name1.compareTo(name2);
}
}
次に、テナントの配列を取り出し (Jackson はそれらをArrayList
オブジェクトにします)、 を呼び出しますCollections.sort(...)
。例えば、
List<Map<String,Object>> tenants =
(List<Map<String,Object>>) parsedJson.get("tenants");
Collections.sort(tenants, new NameComparator());
パート 3: ネスティングの処理
これを行う最も明確な方法は、追加のコードを追加して JSON をウォークスルーし、tenants 配列を持つオブジェクトを探して並べ替えることです。たとえば、これを行う再帰関数は次のとおりです。
public static void recursiveSortTenants(Map<String,Object> jsonObject) {
List<Map<String,Object>> tenants =
(List<Map<String,Object>>) jsonObject.get("tenants");
if (tenants != null) {
Collections.sort(tenants, new NameComparator());
// For each tenant, see if it has sub-tenants. If so,
// call this function again to sort them.
for (Map<String,Object> tenant : tenants) {
if (tenants.containsKey("tenants")) {
recursiveSortTenants(tenant);
}
}
}
}
お役に立てれば!