2014-02-05 3 views
4

У меня есть большой набор JsonObject s внутри ArrayList. Мне нужно добавить эти JsonObject s в файл JsonArray и записать его в файл. Я использую Gson, а ниже - мой код.Поток для написания Json

private void myWriter(List<JsonObject> jsonObjectHolder, int number) throws IOException 
    { 
     System.out.println("Starting to write the JSON File"); 
     //Add everything into a JSONArray 
     JsonArray jsonArrayNew = new JsonArray(); 

     for(int i=0;i<jsonObjectHolder.size();i++) 
     { 
      //System.out.println("inside array: "+i); 
      JsonObject o = jsonObjectHolder.get(i); 
      System.out.println("inside array "+i+": "+o.get("title")); 

      jsonArrayNew.add(jsonObjectHolder.get(i)); 
     } 

     System.out.println("Size: "+jsonArrayNew.size()); 

     //Write it to the File 
     File file= new File("items.json"); 

     FileWriter fw = new FileWriter(file);; 
     fw.write(jsonArrayNew.toString()); 
     fw.flush(); 
     fw.close(); 

     System.out.println("outside array"); 


    } 

Мне не нравится этот путь. ArrayList содержит много данных, и способ, которым я пишу, может генерировать OutOfMemoryError. Вместо этого я хотел бы Stream и записать их в файл.

Update

Согласно ответу SO пользователя "Олден", вот как я редактировал код.

private void myWriter(List<JsonObject> jsonObjectHolder) throws IOException 
{ 
    JsonWriter writer = new JsonWriter(new FileWriter(new File("items.json"))); 
    Gson gson = new Gson(); 

    writer.beginArray(); 

    for (JsonObject jsonObject : jsonObjectHolder) 
    { 
     gson.toJson(jsonObject, writer); 
    } 

    writer.endArray(); 

    writer.close(); 
} 

Пожалуйста, дайте мне знать, правильно ли это делается.

ответ

4

Вы можете использовать Gson в поток список, как это:

private void myWriter(List<JsonObject> jsonObjectHolder, Gson gson) throws IOException 
{ 
    JsonWriter writer = new JsonWriter(new FileWriter(new File("items.json"))); 

    writer.beginArray(); 

    for (JsonObject jsonObject : jsonObjectHolder) 
    { 
     gson.toJson(jsonObject, writer); 
    } 

    writer.endArray(); 

    writer.close(); 
} 

Это предполагает, что вы есть Gson экземпляр, который вы можете использовать. Если вы этого не сделаете, вы можете использовать writer.beginObject() с writer.endObject() и вручную добавить свойства писателю, но я бы не рекомендовал этого, потому что вы уже сделали работу по созданию JsonObject.

+0

Спасибо за ответ. Объект Gson означает просто так? 'Gson g = new Gson()'. Я могу просто создать этот экземпляр внутри метода правильно? –

+0

Да, вы можете. Возможно, вы захотите, чтобы это было создано в другом месте, если вам нужны [пользовательские сериализаторы] (https://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserialization), но вы должны 't здесь, потому что вы имеете дело с 'JsonObject', поэтому inline в порядке. – Alden

+0

Спасибо за ответ. Я сделал обновление для своего сообщения, включая ваш ответ. Пожалуйста, смотрите. –

Смежные вопросы