我正在编写Android应用,我需要输出一些对象'信息到一个文件,以便当用户关闭应用程序等时它仍然存在。现在,我只将这些对象输出为字符串" name&#34 ;,每个都有自己的& #34;值&#34 ;.只是作为序言,我对Java和Android开发都很陌生,所以我为任何愚蠢的错误道歉。
这是输出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 :(得分:1)
如果您只需要将列表存储到磁盘供以后使用,这是一种非常简单的方法。
假设您有一个要存储的字符串ArrayList:
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("one");
arrayList.add("two");
arrayList.add("three");
您可以轻松地将这些存储在应用程序的SharedPreferences
中,这些用户首选项不是用户首选项,而只是用于使用持久数据的密钥/值插槽。您不能直接存储ArrayList,但是您可以存储Set,因此我们首先需要将ArrayList转换为Serializable Set:
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);
我认为这是保存List的一种非常简单和干净的方式。而且你不必乱用所有的JSON。希望它有所帮助!
答案 1 :(得分: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然后返回对象