2016-03-30 11 views
2

JSONファイルairports.jsonには5720個のオブジェクトが含まれています.JavaのファイルをObjects Airportに解析する必要があります。 以下のコードは、私がそれを解析する方法です。問題は、すべてのファイルを完全に解析するのに、約1分50秒かかることです。JSONの解析時間が長すぎます - Android

ArrayList<Airport> arrayAirports = new ArrayList<>(); 
    String json_response = loadJSONFromAsset(); 
    try { 
     JSONObject airports = new JSONObject(json_response.trim()); 

     Log.d("Length Array 0", String.valueOf(airports.names().length())); 
     Log.d("Length Array 1", String.valueOf(arrayAirports.size())); 
     for(int i = 0; i<airports.names().length(); i++){ 
       JSONObject jsonAirport = airports.getJSONObject(airports.names().getString(i)); 
       Airport newAirport = new Airport(); 
       newAirport.name = jsonAirport.getString("name"); 
       newAirport.city = jsonAirport.getString("city"); 
       newAirport.country = jsonAirport.getString("country"); 
       newAirport.latitude = jsonAirport.getString("latitude"); 
       newAirport.longitude = jsonAirport.getString("longitude"); 
       newAirport.altitude = jsonAirport.getString("altitude"); 
       newAirport.iata = jsonAirport.getString("iata"); 
       newAirport.icao = jsonAirport.getString("icao"); 
       newAirport.timeZone = jsonAirport.getString("timezone"); 
       newAirport.dst = jsonAirport.getString("dst"); 
       arrayAirports.add(newAirport); 
     } 



    } catch (JSONException e1) { 
     e1.printStackTrace(); 
    } 

    Log.d("Length Array 2", String.valueOf(arrayAirports.size())); 

これを解析する方法はありますか。ところで は私の友人ではなく、客観C.

Link to JSON file

+0

は、サードパーティのライブラリではなく、手動でhttps://github.com/google/gson – Zaki

+0

それをやって、それを試してみて、私がしようとしています今は使用していますが、毎回JSONファイルをループしてAirportオブジェクトを追加する方法はありませんでした。 –

+0

JSONObject.names()を各繰り返しで2回...? – Selvin

答えて

2

は分からないのですが、あなたは繰り返しnames()を呼び出すべきではありません。変数before loopに代入してから使用してください。いっそ

JSONArray names = airports.names(); 
Log.d("Length Array 0", String.valueOf(names.length())); 
Log.d("Length Array 1", String.valueOf(arrayAirports.size())); 
for(int i = 0; i<names.length(); i++){ 
    JSONObject jsonAirport = airports.getJSONObject(names.getString(i)); 
    // code 
} 

length()keys()を使用します。

Log.d("Length Array 0", String.valueOf(airports.length())); 
Log.d("Length Array 1", String.valueOf(arrayAirports.size())); 
for (Iterator<String> nameIter = airports.keys(); nameIter.hasNext();){ 
    String name = nameIter.next(); 
    JSONObject jsonAirport = airports.getJSONObject(name); 
    // code 
} 
+1

*パフォーマンスに関して重要かどうかわかりません。* ... public JSONArray names(){ JSONArray ja = new JSONArray(); イテレータキー= this.keys(); while(keys.hasNext()){ ja.put(keys.next()); } return ja.length()== 0? null:ja; } '<=もちろんそうです... JSONArrayを' keys() 'サイズのサイズで作成します。' keys() 'を繰り返し、その配列にアイテムを入れてください...このJSONArrayを解放するだけですgc)は時間がかかります – Selvin

+0

@Selvinさらに悪いことに、オブジェクトが空の場合は 'null'を返します。したがって、' NullPointerException'を引き起こす可能性があるので、非常に危険な方法です。 – Andreas

+0

ありがとうございました私のコードをあまり変更しないで私の仕事をしました –

1

使用GSONを使用して、それに速度を測定まったくの時間でそれを解析しています。ファイルを読み込むだけで時間がかかる可能性はありますが、1分はかなり悪いようです。

GSONの使用方法がわからないと言われたので、here's a tutorial I wrote for a student on how to use GSON。それはあなたがネットワークコールからファイルを取得していると仮定しているので、ローカルのJSONファイルを使用するためにそれを適用する必要があります。

1

大規模なJSONデータファイルをJSONObjectに直接配置しています。

トークンベースのリーダー(JsonReaderなど)を使用することをお勧めします。ドキュメントから直接貼り付け

:それはパフォーマンスのために重要な場合

public List readJsonStream(InputStream in) throws IOException { 
    JsonReader reader = new JsonReader(new InputStreamReader(in , "UTF-8")); 
    try { 
     return readMessagesArray(reader); 
     finally { 
      reader.close(); 
     } 
    } 

    public List readMessagesArray(JsonReader reader) throws IOException { 
     List messages = new ArrayList(); 

     reader.beginArray(); 
     while (reader.hasNext()) { 
      messages.add(readMessage(reader)); 
     } 
     reader.endArray(); 
     return messages; 
    } 

    public Message readMessage(JsonReader reader) throws IOException { 
     long id = -1; 
     String text = null; 
     User user = null; 
     List geo = null; 

     reader.beginObject(); 
     while (reader.hasNext()) { 
      String name = reader.nextName(); 
      if (name.equals("id")) { 
       id = reader.nextLong(); 
      } else if (name.equals("text")) { 
       text = reader.nextString(); 
      } else if (name.equals("geo") && reader.peek() != JsonToken.NULL) { 
       geo = readDoublesArray(reader); 
      } else if (name.equals("user")) { 
       user = readUser(reader); 
      } else { 
       reader.skipValue(); 
      } 
     } 
     reader.endObject(); 
     return new Message(id, text, user, geo); 
    } 

    public List readDoublesArray(JsonReader reader) throws IOException { 
     List doubles = new ArrayList(); 

     reader.beginArray(); 
     while (reader.hasNext()) { 
      doubles.add(reader.nextDouble()); 
     } 
     reader.endArray(); 
     return doubles; 
    } 

    public User readUser(JsonReader reader) throws IOException { 
     String username = null; 
     int followersCount = -1; 

     reader.beginObject(); 
     while (reader.hasNext()) { 
      String name = reader.nextName(); 
      if (name.equals("name")) { 
       username = reader.nextString(); 
      } else if (name.equals("followers_count")) { 
       followersCount = reader.nextInt(); 
      } else { 
       reader.skipValue(); 
      } 
     } 
     reader.endObject(); 
     return new User(username, followersCount); 
    } 
} 
関連する問題