Запись JSON в файл
У меня есть класс compositionJSON. Класс имеет метод, вызывающий makeJSONObject, который создает JSON-объект и помещает в него содержимое. Вот код класса.
public class CompositionJso extends JSONObject {
public JSONObject makeJSONObject (String title, String desc, ArrayList<String> imgPath, ArrayList<Resources> imgView) {
JSONObject obj = new JSONObject() ;
try {
obj.put("title", title);
obj.put("desc", desc);
obj.put("imgPath", imgPath);
obj.put("imgViewPath", imgView);
} catch (JSONException e) {
e.printStackTrace();
}
return obj;
}
Теперь я создаю экземпляр этого класса и вызываю метод в другом классе. После этого я хочу записать JSONObject в файл и сохранить его на sd-карте на устройстве. Вот код:
saveCompo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setName();
createJSONFolder();
CompositionJso obj = new CompositionJso();
obj.makeJSONObject(compoTitle, compoDesc, imgPaths, imageViewPaths);
MyCompositionsListActivity.buildList();
try {
Writer output = null;
File file = new File("storage/sdcard/MyIdea/MyCompositions/" + compoTitle + ".json");
output = new BufferedWriter(new FileWriter(file));
output.write(obj.toString());
output.close();
Toast.makeText(getApplicationContext(), "Composition saved", Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
finish();
}
});
Файл успешно сохраняется, но если я открою его, внутри ничего нет. Что не так с кодом?
4 ответа:
makeJSONObject
возвращаетсяJSONObject
Ваш код должен быть
saveCompo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setName(); createJSONFolder(); CompositionJso obj = new CompositionJso(); JSONObject jsonObject = obj.makeJSONObject(compoTitle, compoDesc, imgPaths, imageViewPaths); MyCompositionsListActivity.buildList(); try { Writer output = null; File file = new File("storage/sdcard/MyIdea/MyCompositions/" + compoTitle + ".json"); output = new BufferedWriter(new FileWriter(file)); output.write(jsonObject.toString()); output.close(); Toast.makeText(getApplicationContext(), "Composition saved", Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show(); } finish(); } });
Спасибо @Chris Handy! Я создал JSONObjectVariable и назначил его makeJSONObject. Вот мой окончательный код:
saveCompo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setName(); createJSONFolder(); CompositionJso compositionJso = new CompositionJso(); JSONObject obj; obj = compositionJso.makeJSONObject(compoTitle, compoDesc, imgPaths, imageViewPaths); MyCompositionsListActivity.buildList(); try { Writer output; File file = new File("storage/sdcard/MyIdea/MyCompositions/" + compoTitle + ".json"); output = new BufferedWriter(new FileWriter(file)); output.write(obj.toString()); output.close(); Toast.makeText(getApplicationContext(), "Composition saved", Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show(); } finish(); } });
В методе makeJSONObject создается экземпляр нового JSONObject.
Этот код должен работать.
public void makeJSONObject (String title, String desc, ArrayList<String> imgPath, ArrayList<Resources> imgView) { try { this.put("title", title); this.put("desc", desc); this.put("imgPath", imgPath); this.put("imgViewPath", imgView); } catch (JSONException e) { e.printStackTrace(); } }
Попробуйте написать простую
class
со статическими методами для сохранения и извлеченияjson object
в файл:Код:
public class RetriveandSaveJSONdatafromfile { public static String objectToFile(Object object) throws IOException { String path = Environment.getExternalStorageDirectory() + File.separator + "/AppName/App_cache" + File.separator; File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } path += "data"; File data = new File(path); if (!data.createNewFile()) { data.delete(); data.createNewFile(); } ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data)); objectOutputStream.writeObject(object); objectOutputStream.close(); return path; } public static Object objectFromFile(String path) throws IOException, ClassNotFoundException { Object object = null; File data = new File(path); if(data.exists()) { ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data)); object = objectInputStream.readObject(); objectInputStream.close(); } return object; } }
Для сохранения json в файле используйте
RetriveandSaveJSONdatafromfile.objectToFile(jsonObj)
и для извлечения данных из файла используйтеpath = Environment.getExternalStorageDirectory() + File.separator + "/AppName/App_cache/data" + File.separator; RetriveandSaveJSONdatafromfile.objectFromFile(path);