2016-10-17 8 views
0

私は、文字列表記のJSONオブジェクトの束がありますので、JSONオブジェクトの各フィルタのJSONオブジェクトが

"{\"address\":{\"street\":\"Steenstraat\",\"housenumber\":\"17A\",\"postalcode\":\"6828 CA\",\"city\":\"ARNHEM\",\"geoLocation\":{\"lat\":\"51.983718\",\"lng\":\"5.915553\"}},\"distance\":0,\"type\":\"ING\"} 

はこのようなものになります。今

{ 
     "address" : { 
       "street" : "Steenstraat", 
       "housnumber" : "17A", 
       "postalcode" : "6828 CA", 
       "city" : "ARNHEM", 
       "geolocation" : { 
          "latitude" : "51.983718", 
          "longitude" : "54.983718" 
          } 
        }, 
       "type" : "citi", 
       "distance" : 0 
    } 

を、私はGoogleの使用しましたJSONライブラリを残りのAPIから取得することができ、それは上記のJSONオブジェクトの多くの文字列を私に与えてくれました。 JSONオブジェクトを特定のパラメータ(たとえば、都市名による並べ替え)で並べ替えるには、どのようにフィルタリング(またはJSONの構造を再定義)することができますか?

これは私のAtmクラスです。 JSON文字列をAtmオブジェクトのリストに変換しようとしています。

public class Atm { 

    private String type; 
    private Long distance; 
    private Map<String, String> address = new HashMap<String, String>(); 

    public Atm() { 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public Long getDistance() { 
     return distance; 
    } 

    public void setDistance(Long distance) { 
     this.distance = distance; 
    } 

    public Map<String, String> getAddress() { 
     return address; 
    } 

    public void setAddress(Map<String, String> address) { 
     this.address = address; 
    } 

    @Override 
    public String toString() { 
     return "Atm{" + 
       "type='" + type + 
       ", distance=" + distance + 
       ", address=" + address.toString() + 
       '}'; 
    } 
} 

Javaデータ構造に変換せずにこれを行う方法はありますか?

+0

どの言語が必要ですか? –

+1

Java、好ましくは –

+0

これは同じです[投稿](http://stackoverflow.com/questions/19543862/how-can-i-sort-a-jsonarray-in-java) –

答えて

0

注:JSONにサブエレメントgeoLocationを使用しているため、Map<String, String>は使用できません。 代わりにMap<String, Object>を使用するか、住所を表すカスタムクラスを作成する必要があります。

Atmリストを都市別にフィルタリングするには、以下の操作を行うことができます。 Javaの8で

Gson gson = new Gson(); 
String atm1 = "{\"address\":{\"street\":\"Steenstraat\",\"housenumber\":\"17A\",\"postalcode\":\"6828 CA\",\"city\":\"ARNHEM\",\"geoLocation\":{\"lat\":\"51.983718\",\"lng\":\"5.915553\"}},\"distance\":0,\"type\":\"ING\"}"; 
String atm2 = "{\"address\":{\"street\":\"Steenstraat\",\"housenumber\":\"17A\",\"postalcode\":\"6828 CA\",\"city\":\"ARNHEM\",\"geoLocation\":{\"lat\":\"51.983718\",\"lng\":\"5.915553\"}},\"distance\":0,\"type\":\"ING\"}"; 
String atm3 = "{\"address\":{\"street\":\"Steenstraat\",\"housenumber\":\"17A\",\"postalcode\":\"6828 CA\",\"city\":\"NEW-YORK\",\"geoLocation\":{\"lat\":\"51.983718\",\"lng\":\"5.915553\"}},\"distance\":0,\"type\":\"ING\"}"; 

List<Atm> atms = new ArrayList<Atm>(); 

atms.add(gson.fromJson(atm1, Atm.class)); 
atms.add(gson.fromJson(atm2, Atm.class)); 
atms.add(gson.fromJson(atm3, Atm.class)); 

List<Atm> filteredOnCity = atms.stream().filter(atm -> atm.getAddress().get("city") 
    .equals("ARNHEM")).collect(Collectors.toList()); 

のApache Commonsの-collections4付:

のJavaに送信する前にクライアント側でそれらをフィルタリングしたりソートしないのはなぜ
//Build your list with code from above 
Predicate<Atm> filterOnCity = new Predicate<Atm>() { 
    @Override 
    public boolean evaluate(Atm atm) { 
     return atm.getAddress().get("city").equals("ARNHEM"); 
    } 
}; 

CollectionUtils.filter(atms, filterOnCity); 
+0

私は何とかこれを使用せずに行うことはできますかJavaの?私はそれからリストを作成しようとすると、このエラーが発生し続ける:期待BEGIN_ARRAYが、1行2列の行でSTRINGでした そして、私はなぜこのエラーが発生しているか知っていると思います。 Map のリストを作成しようとしているためですが、マップの最後の要素は別のマップ(ジオロケーションのもの) –

+0

これを行う最も簡単な方法は、 、String>を 'Map 'に変換します。 それからそれは箱のまっすぐに実行されます。 –

+0

いいえ、まだ同じエラーが発生しています –

0

var arr = JSON.parse(MY_JSON_ARRAY_STRING); 

arr.sort(function(a, b){ 
    if (a.city < b.city) 
     return -1; 
    if (a.city > b.city) 
     return 1; 
    return 0; 
}); 

var arrString = JSON.stringify(arr); 
関連する問題