2017-12-09 25 views
0

私はこのようなJSONオブジェクトのソート方法についてしばらく探してきました。それは多くの属性を持っていますが、オブジェクトをアルファベット順にソートしようとしています:AndroidスタジオでのJSONオブジェクトのソート(java)

私は本当に初心者ですので、あなたはすばらしいことになるでしょう。

//更新:

だから私は、各レストランの属性を抽出する方法を考え出したと今、私はJSONオブジェクトをソートするためのコンパレータを実装しようとしているが、私は、コンパレータを呼び出す方法に困惑していますそしてこれは、私もそれだけを返しますので、これは、オブジェクトをソートする方法については少し混乱している私が使用しているコンパレータは

public class AlphabeticalComparator implements Comparator<String> { 
     public int compare(String obj1, String obj2) { 
      if (obj1 == null) { 
       return -1; 
      } 
      if (obj2 == null) { 
       return 1; 
      } 
      if (obj1.equals(obj2)) { 
       return 0; 
      } 
      return obj1.compareTo(obj2); 
     } 
    } 

(インターネットからそれを得た)入力

にどのような引数です整数。並べ替えしようとしてJSONオブジェクトイムは、これは私がのペアを注文Comparatorを書く

``

{ 
    "results_found": 10573, 
    "results_start": 0, 
    "results_shown": 20, 
    "restaurants": [ 
    { 
     "restaurant": { 
     "R": { 
      "res_id": 16795271 
     }, 
     "apikey": "fa221c30c201daf8380ac435cedfebe9", 
     "id": "16795271", 
     "name": "Craigie On Main", //This is what I want to sort it by 
     "url": "https://www.zomato.com/boston/craigie-on-main-cambridge?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "location": { 
      "address": "853 Main St, Cambridge 02139", 
      "locality": "Central Square", 
      "city": "Boston", 
      "city_id": 289, 
      "latitude": "42.3634820000", 
      "longitude": "-71.0985660000", 
      "zipcode": "02139", 
      "country_id": 216, 
      "locality_verbose": "Central Square, Boston" 
     }, 
     "switch_to_order_menu": 0, 
     "cuisines": "European, French", 
     "average_cost_for_two": 275, 
     "price_range": 4, 
     "currency": "$", 
     "offers": [], 
     "thumb": "https://b.zmtcdn.com/data/res_imagery/16795271_CHAIN_bd36a0893cde3f70ab4a67f1e086d5f5.jpg?fit=around%7C200%3A200&crop=200%3A200%3B%2A%2C%2A", 
     "user_rating": { 
      "aggregate_rating": "4.2", 
      "rating_text": "Very Good", 
      "rating_color": "5BA829", 
      "votes": "342" 
     }, 
     "photos_url": "https://www.zomato.com/boston/craigie-on-main-cambridge/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop", 
     "menu_url": "https://www.zomato.com/boston/craigie-on-main-cambridge/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop", 
     "featured_image": "https://b.zmtcdn.com/data/res_imagery/16795271_CHAIN_bd36a0893cde3f70ab4a67f1e086d5f5.jpg", 
     "has_online_delivery": 0, 
     "is_delivering_now": 0, 
     "deeplink": "zomato://restaurant/16795271", 
     "has_table_booking": 0, 
     "events_url": "https://www.zomato.com/boston/craigie-on-main-cambridge/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "establishment_types": [] 
     } 
    }, 
    { 
     "restaurant": { 
     "R": { 
      "res_id": 16798941 
     }, 
     "apikey": "fa221c30c201daf8380ac435cedfebe9", 
     "id": "16798941", 
     "name": "O Ya", 
     "url": "https://www.zomato.com/boston/o-ya-boston?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "location": { 
      "address": "9 East St, Boston 02111", 
      "locality": "Leather District", 
      "city": "Boston", 
      "city_id": 289, 
      "latitude": "42.3513170000", 
      "longitude": "-71.0570370000", 
      "zipcode": "02111", 
      "country_id": 216, 
      "locality_verbose": "Leather District, Boston" 
     }, 
     "switch_to_order_menu": 0, 
     "cuisines": "Japanese, Sushi", 
     "average_cost_for_two": 275, 
     "price_range": 4, 
     "currency": "$", 
     "offers": [], 
     "thumb": "https://b.zmtcdn.com/data/res_imagery/16798941_CHAIN_d58be7a0f56ad4fbad498ba65b746a67.jpg?fit=around%7C200%3A200&crop=200%3A200%3B%2A%2C%2A", 
     "user_rating": { 
      "aggregate_rating": "4.3", 
      "rating_text": "Very Good", 
      "rating_color": "5BA829", 
      "votes": "192" 
     }, 
     "photos_url": "https://www.zomato.com/boston/o-ya-boston/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop", 
     "menu_url": "https://www.zomato.com/boston/o-ya-boston/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop", 
     "featured_image": "https://b.zmtcdn.com/data/res_imagery/16798941_CHAIN_d58be7a0f56ad4fbad498ba65b746a67.jpg?output-format=webp", 
     "has_online_delivery": 0, 
     "is_delivering_now": 0, 
     "deeplink": "zomato://restaurant/16798941", 
     "has_table_booking": 0, 
     "events_url": "https://www.zomato.com/boston/o-ya-boston/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "establishment_types": [] 
     } 
    }, 
    { 
     "restaurant": { 
     "R": { 
      "res_id": 16798079 
     }, 
     "apikey": "fa221c30c201daf8380ac435cedfebe9", 
     "id": "16798079", 
     "name": "Solea Restaurant and Tapas Bar", 
     "url": "https://www.zomato.com/boston/solea-restaurant-and-tapas-bar-waltham?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "location": { 
      "address": "388 Moody St, Waltham 02453", 
      "locality": "Waltham", 
      "city": "Boston", 
      "city_id": 289, 
      "latitude": "42.3695490000", 
      "longitude": "-71.2370130000", 
      "zipcode": "02453", 
      "country_id": 216, 
      "locality_verbose": "Waltham, Boston" 
     }, 
     "switch_to_order_menu": 0, 
     "cuisines": "Spanish, Tapas", 
     "average_cost_for_two": 275, 
     "price_range": 4, 
     "currency": "$", 
     "offers": [], 
     "thumb": "", 
     "user_rating": { 
      "aggregate_rating": "4.2", 
      "rating_text": "Very Good", 
      "rating_color": "5BA829", 
      "votes": "303" 
     }, 
     "photos_url": "https://www.zomato.com/boston/solea-restaurant-and-tapas-bar-waltham/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop", 
     "menu_url": "https://www.zomato.com/boston/solea-restaurant-and-tapas-bar-waltham/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop", 
     "featured_image": "", 
     "has_online_delivery": 0, 
     "is_delivering_now": 0, 
     "deeplink": "zomato://restaurant/16798079", 
     "has_table_booking": 0, 
     "events_url": "https://www.zomato.com/boston/solea-restaurant-and-tapas-bar-waltham/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "establishment_types": [] 
     } 
    }, 
"restaurant": { 
     "R": { 
      "res_id": 16796139 
     }, 
     "apikey": "fa221c30c201daf8380ac435cedfebe9", 
     "id": "16796139", 
     "name": "Harvest", 
     "url": "https://www.zomato.com/boston/harvest-cambridge?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "location": { 
      "address": "44 Brattle St, Cambridge 02138", 
      "locality": "Harvard Square", 
      "city": "Boston", 
      "city_id": 289, 
      "latitude": "42.3742680000", 
      "longitude": "-71.1219960000", 
      "zipcode": "02138", 
      "country_id": 216, 
      "locality_verbose": "Harvard Square, Boston" 
     }, 
     "switch_to_order_menu": 0, 
     "cuisines": "American, Breakfast", 
     "average_cost_for_two": 275, 
     "price_range": 4, 
     "currency": "$", 
     "offers": [], 
     "thumb": "https://b.zmtcdn.com/data/res_imagery/16796139_RESTAURANT_4f9960714d6bd153a4571dd062c4ff45.jpg?fit=around%7C200%3A200&crop=200%3A200%3B%2A%2C%2A", 
     "user_rating": { 
      "aggregate_rating": "3.9", 
      "rating_text": "Good", 
      "rating_color": "9ACD32", 
      "votes": "190" 
     }, 
     "photos_url": "https://www.zomato.com/boston/harvest-cambridge/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop", 
     "menu_url": "https://www.zomato.com/boston/harvest-cambridge/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop", 
     "featured_image": "https://b.zmtcdn.com/data/res_imagery/16796139_RESTAURANT_4f9960714d6bd153a4571dd062c4ff45.jpg", 
     "has_online_delivery": 0, 
     "is_delivering_now": 0, 
     "deeplink": "zomato://restaurant/16796139", 
     "has_table_booking": 0, 
     "events_url": "https://www.zomato.com/boston/harvest-cambridge/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "establishment_types": [] 
     } 
    }, 
+0

気付いてありがとう、私はそれを質問から削除しました – Joe

+0

HashMapと同様に、JSONにはキーの順序付けの概念がありません。とにかくこのJSONをObjectに解析するつもりはありませんか? –

答えて

1

zomato APIに接続するときに私が応答に入るJSONオブジェクトである

を下回っていますJSONオブジェクトはそれぞれのname属性に基づいています。それを使用してJSONオブジェクトの配列をソートします。例えばArrays.sort(objects, comparator)を使用してください。ここで

は(より一般的な)例です。

あなたはJSONオブジェクトタイプ(またはカスタムクラス)でOffersOrderクラスを置き換えるためにそのコードを変更して実装することができますコンパレータはオブジェクトを比較し、適切な値を返します。

+0

私はもう少し調べてこのコードを見つけました – Joe

+0

あなたが見つけたそのコードは実際のJavaコードではありません。 'Arrays.sort'や' Collections.sort'の仕組みを理解したいなら、javadocがそれを説明します。 –

+0

OK病気を修正しようとしました、ありがとう! – Joe

0

少し古いGoogleのgsonライブラリを使用することに慣れています。より良いJSONパーサが利用可能である場合、私は誰かがチャイムことができると確信してい あなたが情報を抽出するために、このようにそれを使用したい:。

String restaurantName; 
JsonElement restaurantJSONElement; 
JsonPrimitive restaurantJSONPrimitive; 

JsonParser parser = new JsonParser(); 
// myJSONstring is the raw JSON data 
JsonElement parentJSONElement = parser.parse(myJSONstring); 
JsonObject parentJSONObject = parentJSONElement.getAsJsonObject(); 
JsonArray restaurantsJSONArray = (JsonArray) parentJSONObject.get("restaurants"); 
for(int i=0;i<restaurantsJSONArray.size();i++){ 
    //get the element 
    restaurantJSONElement = ((JsonObject)restaurantsJSONArray.get(i)).get("restaurant"); 
    //get the restaurant name 
    restaurantJSONPrimitive = ((JsonObject)restaurantJSONElement.getAsJsonObject()).getAsJsonPrimitive("name"); 
    restaurantName = restaurantJSONPrimitive.getAsString(); 
} 

あなたは、すべてのメンバーを抽出し、それらをあなたがやりたいことができそれらをカスタムオブジェクト配列に入れ、レストラン名で比較すると

+1

Gsonは古いものではありません... –

+0

Gsonは既にアンドロイドスタジオに含まれていますか、または「シンボルを解決できません」というエラーがたくさんあるので、ライブラリをインポートする必要がありますか? – Joe

+0

nvmは、 .jarファイルをlibsフォルダに入れ、それをアプリケーションの依存関係に追加します。https://www.youtube.com/watch?v=jqv3Qkgop88​​&t=89s – Joe

関連する問題