2015-10-12 5 views
0

Я пишу приложение для Android, где мне нужно вывести информацию о некоторых объектах в файл, чтобы он все еще присутствовал, когда пользователь закрывает приложение и т. Д. Я выводил эти объекты только как «имя», каждый со своим «значением». И только для предисловия, я очень новичок в разработке Java и Android, поэтому извиняюсь за любые глупые ошибки.Выход JSON в файл, затем введите его обратно в

Вот код, чтобы вывести JSON:

public static String outputFile(FileOutputStream out, String name, List<String> values) 
{ 
    String outputString = ""; 
    outputString += "\"meals\":[\n"; 

    for (int i = 0; i < values.size(); i++) 
    { 
     outputString += "{\"" + name + "\": \"" + values.get(i) + "\"},\n"; //output: {"name":"value"}, for every element 
    } 
    outputString = outputString.substring(0, outputString.length()-2); //this takes off the newline char, and the last comma. 
    outputString += "\n"; //add the newline character back on. 
    outputString += "]"; 

    Gson g = new Gson(); 
    String s = g.toJson(outputString); 

    try 
    { 
     out.write(s.getBytes()); 
     out.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    return outputString; //debug only 
} 

Тогда позже, я использую это для ввода JSON и анализировать каждый объект с соответствующим значением:

public static List<String> inputFile(Context context, FileInputStream in, List<String> names) 
{ 
    InputStreamReader inReader = new InputStreamReader(in); 
    BufferedReader bufferedReader = new BufferedReader(inReader); 
    StringBuilder builder = new StringBuilder(); 
    String line; 
    String tempJson = ""; 

    List<String> tempList = new ArrayList<>(); 

    try 
    { 
     while ((line = bufferedReader.readLine()) != null) 
     { 
      builder.append(line); 
      String readJson = builder.toString(); 
      Gson readGson = new Gson(); 
      tempJson = readGson.fromJson(readJson, String.class); 
     } 
     in.close(); //close the file here? 


     JSONObject jobj = new JSONObject(tempJson); 

     for (int i = 0; i < names.size(); i++) 
     { 
      tempList.add(jobj.getString(names.get(i))); //this should add the JSON string stored at every index i in names. 
     } 

     //debug: 
     Toast.makeText(context, tempList.toString(), Toast.LENGTH_LONG).show(); 

     return tempList; 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 

     //debug: 
     Toast.makeText(context, tempList.toString(), Toast.LENGTH_LONG).show(); 

     return new ArrayList<>(Arrays.asList("File Input Error!")); //return a blank-ish list? 
    } 
} 
} 

Я «Конечно, есть более простой способ сделать это. Может быть, я не использую gson, как должен? Любая помощь приветствуется.

+0

Я немного смущен. Почему вы используете JSON в первую очередь? Похоже, вам не нужен JSON, поскольку во втором коде вы возвращаете список. – NoChinDeluxe

+0

@drschultz, есть способ, который я могу вывести список непосредственно в файл, а затем ввести его как список? У меня создалось впечатление, что я могу только вывести какой-то JSON или XML. – youravgjoe

+0

Да. Вы можете сохранить все типы данных! См. Мой ответ ниже. – NoChinDeluxe

ответ

1

Если вам просто нужно хранить список на диск для последующего использования, здесь довольно простой способ сделать это.

Допустим, у вас есть ArrayList цепочек вы хотите сохранить:

ArrayList<String> arrayList = new ArrayList<>(); 
arrayList.add("one"); 
arrayList.add("two"); 
arrayList.add("three"); 

Вы можете легко хранить их в SharedPreferences для приложения, которые не являются на самом деле предпочтения пользователей, но только основные слоты/значение, которые легко доступны для использования постоянных данных. Вы не можете хранить ArrayList непосредственно, но вы можете сохранить набор, так что мы в первую очередь необходимо, чтобы превратить нашу ArrayList в сериализуемого Набор:

HashSet<String> hashSet = new HashSet<>(arrayList); 

Тогда мы получим экземпляр из приложения SharedPreferences и спасти наши новый HashSet на диск:

SharedPreferences sharedPreferences = getSharedPreferences("whatever_you_want_to_name_this", MODE_PRIVATE); 
SharedPreferences.Editor editor = sharedPreferences.edit(); 
editor.putStringSet("name_of_the_preference_to_modify", hashSet); 
editor.apply(); 

И все! Когда вы будете готовы, чтобы получить данные, вам нужно сначала получить HashSet, сохраненный:

SharedPreferences sharedPreferences = getSharedPreferences("whatever_you_want_to_name_this", MODE_PRIVATE); 
HashSet<String> hashSet = (HashSet<String>) sharedPreferences.getStringSet("name_of_the_preference_to_modify", new HashSet<String>()); 

И просто преобразовать его обратно в ArrayList:

ArrayList<String> arrayList = new ArrayList<>(hashSet); 

Я думаю, что это довольно простой и чистый способ сохранить список. И вам не придется возиться со всем JSON. Надеюсь, поможет!

+0

Удивительный! Это будет отлично работать для того, что мне нужно. Спасибо за помощь! – youravgjoe

+0

Рад помочь! Удачи! – NoChinDeluxe

+0

Итак, у меня была возможность добавить это в свой код и немного пообщаться с ним, и когда я прочитал список, все элементы списка не в порядке. Вы знаете, почему это будет @drshultz? – youravgjoe

0

Попробуйте этот подход:

public void saveObject(Object object) { 
    String key = object.getClass().getSimpleName(); 
    Gson gson = new Gson() ; 
    String objectJSON = gson.toJson(object); 
    SharedPreferences sharedPreferences = context.getSharedPreferences("Pref name here", context.MODE_PRIVATE); 
    SharedPreferences.Editor prefsEditor = sharedPreferences.edit(); 
    prefsEditor.putString(key, objectJSON); 
} 

public Object retrieveObject(Class objectClass){ 
    String key = objectClass.getSimpleName(); 
    Gson gson = new Gson(); 
    SharedPreferences sharedPreferences = context.getSharedPreferences("Pref name here", context.MODE_PRIVATE); 
    String objectJSON = sharedPreferences.getString(key, ""); 
    Object object = gson.fromJson(objectJSON, objectClass); 
    return object; 
} 

Первый преобразует объект в строку JSON и сохранить его в общих настройках.

Второй получить строку преобразовать его в формат JSON, а затем возвращает объект

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