0

ネストされた JSON 配列をソートするにはどうすればよいですか? 以下の JSON のように...

{
    "id":"rtmc05.lax.someabc.net",
    "name":"rtmc05.lax.someabc.net",

    "tenants":[{
        "id":"rtmc",
        "name":"rtmc"
    },{
        "id":"hrs",
        "name":"hrs"
    },{
        "id":"amotelbe1",
        "name":"amotelbe"
    },{
        "id":"cds",
        "name":"cds"
    },{
        "id":"idx-server",
        "name":"idx-server",

        "tenants":[{
            "id":"amotelbe",
            "name":"amotelbe",

            "tenants":[{
                "id":"amotelui",
                "name":"amotelui"
            }]
        }]
    }]
}
4

3 に答える 3

1

あなたの質問には暗示的な部分がいくつかあり、どこで問題が発生しているのか明確ではありません。

  1. JSON 文字列を取得して、そこから使用可能な Java オブジェクトを作成するにはどうすればよいですか。(質問に「java」のタグを付けたので、JavaScriptではなくJavaを想定しています。)
  2. それらが作られた後、それらのオブジェクトをどのように分類しますか?
  3. ネストされたパーツのソートをどのように処理しますか? (あなたの例では、「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);
            }
        }
    }
}

お役に立てれば!

于 2012-06-20T14:51:51.817 に答える
0

それを(javascript)オブジェクトに解析してから、そのようなjavascriptオブジェクトの配列をソートするソート関数を記述します。

于 2012-06-20T14:20:10.097 に答える
0

( GsonまたはJacksonを使用して) POJO にデシリアライズし、その POJOのComparatorを記述します。

于 2012-06-20T14:23:58.243 に答える