본문 바로가기

안드로이드/러닝패스

[#A3 DEPRECATED] JSON 데이터를 내 앱에 저장하는 방법

러닝패스 [#A2]에서는 SharedPreferences를 이용한 간단한 데이터 저장 방법을 소개했습니다. 이것은 확실히 간단한 데이터 셋 저장에는 유리하지만, 복잡한 데이터 셋들을 관리하기에는 JSON 데이터 형식으로 앱에 저장하는게 훨씬 유리합니다.


따라서 오늘은 SharedPreferences.xml 과 마찬가지로 JSON 데이터 파일을 저장하고, 읽어오는 방법에 대해 알아보겠습니다.


*WRITE


JSON 데이터를 쓰는 방법은 이렇게 동작합니다.


저장할 데이터의 POJO 클래스를 생성 -> POJO 클래스의 인스턴스를 이용해 데이터를 SET -> POJO 클래스의 인스턴스를 JSON 형식으로 변환 후 지정된 FileName으로 FileOutputStream을 이용해 쓰기




1.예시로 생성한 POJO 클래스 Note.java 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Note {
 
    private String title;
    private String note;
    private String date;
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public void setNote(String note) {
        this.note = note;
    }
 
    public void setDate(String date) {
        this.date = date;
    }
 
    public String getTitle() {
        return title;
    }
 
    public String getNote() {
        return note;
    }
 
    public String getDate() {
        return date;
    }
 
}
cs


Note 클래스는 세 가지의 데이터, 즉 title, note, date를 받습니다. 따라서 저장될 JSON 데이터는 이 세 가지의 데이터를 저장하고, 또 가져오는 형태가 됩니다.




2. Note 클래스(POJO)의 인스턴스 생성 및 데이터 SET


1
2
3
4
Note note = new Note();
note.setTitle(title);
note.setNote(note);
note.setDate(date);
cs


3. Note 클래스의 인스턴스를 JSON으로 변환 후 FileName으로 FileOutputStream을 이용해 쓰기


JSON으로 변환하기 전, FileName을 지정해줍니다.


1
String filename = currentDate+".json";
cs


이름에 형식은 없으며, 마지막 ".json" 으로 반드시 데이터 저장 형식을 JSON으로 지정합니다.

다음으로 JsonUtil.toJson() 메소드를 이용해 Note 클래스의 인스턴스 note 를 JSON 형식을 거쳐 String 형식으로 변환한 후, FileOutputStream을 사용해 쓰기를 완료하면 데이터 저장이 완료됩니다.



***반드시 여기에서 JsonUtil의 소스 코드를 확인 후 추가하세요***


1
2
3
4
5
6
7
8
9
10
11
12
13
FileOutputStream outputStream;
 
try {
 
    outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
    outputStream.write(JsonUtil.toJSon(note).getBytes());
    outputStream.close();
catch (Exception e) {
 
    e.printStackTrace();
 
 
}
cs



SOURCE CODE


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Note note = new Note();
note.setTitle(title);
note.setNote(note);
note.setDate(date);
 
String filename = currentDate+".json";
FileOutputStream outputStream;
 
try {
 
    outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
    outputStream.write(JsonUtil.toJSon(note).getBytes());
    outputStream.close();
 
catch (Exception e) {
 
    e.printStackTrace();
 
}
cs



*READ


JSON 데이터를 읽는 방법은 이렇게 동작합니다.


지정된 경로에 파일이 있는지 확인 -> 파일을 String 형태로 가져온 후, JSONObject로 데이터 추출



1.지정된 경로에 파일이 있는지 확인


먼저 지정한 FileName을 이용해 파일의 정보를 가져옵니다


1
File file = new File(getApplication().getFilesDir(), currentDate+".json");
cs


이후 이 파일의 유무는 아래의 if 문으로 확인할 수 있습니다.


1
if( file.exists() )
cs



2.파일을 String 형태로 가져온 후, JSONObject로 데이터 추출


만약 성공적으로 데이터의 존재를 확인했다면 String 형태로 data를 가져온 후, JSONObject를 이용해 세 가지 데이터, 즉 title, note, date를 추출합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try {
 
    String data = getStringFromFile(file.getPath());
 
    JSONObject jObj = new JSONObject(data);
 
    String downloadTitle = jObj.getString("title");
    String downloadNote = jObj.getString("note");
    String downloadDate = jObj.getString("date");
 
}catch (Exception e){
 
 
    e.printStackTrace();
 
 
}
cs



SOURCE CODE


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if(file.exists()){
 
    try {
 
 
        //READ NOTE
        String data = getStringFromFile(file.getPath());
 
 
        JSONObject jObj = new JSONObject(data);
 
 
        String downloadTitle = jObj.getString("title");
        String downloadNote = jObj.getString("note");
        String downloadDate = jObj.getString("date");
 
 
    }catch (Exception e){
 
 
 
        e.printStackTrace();
 
 
    }
 
}
 
cs