마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

[초보] Gson 데이터 관리에 관해서 질문드립니다.

0 추천

Gson 사용하니 편한건 알겠습니다. 근데 아직 사용법이라고 해야하나 궁금한게 있는데 조언 부탁드립니다.

 

파싱하는 클래스

Gson gson = new Gson();
 JsonParser parser = new JsonParser();
                
TestValue = gson.fromJson(json, TestValue .class);
Log.i(TAG, "TestValue .getName() : "+TestValue .getName());

 

TestValue.class 

private String name;

외 age, address, idx 있음

다 set, get 메소드 있음

 

다른 클래스에서 name 값을 가져다 쓰고 싶을땐

테스트벨류 클래스의 getName() 함수를 통해 쓰면 된다는건 잘알겠습니다.

원래 DTO(?)클래스 자체는 써봐서 압니다.

 

 

이때 데이터가 배열에 경우면 파싱하는 클래스에서는... 이런식으로 잘 사용하고 있습니다.

JsonElement testObejct = parser.parse(json).getAsJsonObject().get("student");
                
TestValue[] tv = gson.fromJson(testObejct , TestValue[].class);
List<TestValue> list = Arrays.asList(tv); 


 int size = list .size();

  for(int i=0; i<size ; i++){               
                    Log.i(TAG, "idx: "+TestValue.get(i).getIdx());
                    Log.i(TAG, "name: "+TestValue.get(i).getName());
                    Log.i(TAG, "age: "+TestValue.get(i).getAge());
                    Log.i(TAG, "address : "+TestValue.get(i).getAddress());
  }

로 쉽게 접근이 되더라고요..

 

근데 다른 클래스에서 쓰려면 어찌합니까???

예를 들어... testValue.getName(); 하면 몇번재 학생의 이름인지 어떻게 압니까??

그리고 testValue 클래스는 파싱하는곳에 new해서 선언하니깐 그 클래스에 변수 참조하기위해

스태틱으로 해줘야하나요?? 파싱한 곳에서 Gson 이나 파서 객체 다 생성해두니 

다른곳에서는 어떻게 접근해야할지 모르겠고요 배열에 경우 데이터 관리를 어케해야할지 잘모르겠습니다.

 

아니면 DTO 클래스를 변경해줘야하는지

개념을 잘 모르겠습니다....

익명사용자 님이 2016년 2월 29일 질문

1개의 답변

0 추천

너무 어렵게 생각하시는거 같은데요..

어디서 어떤 이벤트에 작동하는걸 구현하시는진 모르겠지만,

아무 이벤트나 동작없이 내가 몇번째 학생의 몇번째 이름을 가져 오겠다! 이거는 당연히 가져올수 없구요,

일단 리스트에 담았다고 하면 리스트뷰 등에 사용하실 텐데요

list에 순서대로 담겨있을테니 그 데이터를 그대로 뿌리면 리스트뷰에는 순서대로 나오겠죠

자 이제 예를 들어 이 리스트에서 하나의 셀을 선택한다고 가정했을때,

리스트뷰 클릭이벤트를 상속받으면 position을 가져올수 있죠?

그럼 TestValue item = list.get(position) 이런식으로 하면 해당 셀에 데이터를 다가져올수 있죠

그럼 이 item으로 이름을 가져오던 뭘 가져오던 하면 됩니다.

 

캬옹이 (37,920 포인트) 님이 2016년 2월 29일 답변
근데 이 값을 리스트뷰로 표현하진않고

일단 다 잘가지고 있다가 언제 어디서든 쓰고싶은거거든요

그걸 뷰에 표현하든 아니면 로그로 뿌려서 보든 아니면 그 값을 서버에 전송하든요

그리고 제가 이해력이 부족하니 좀 더 쉽게 설명 부탁드려요 ㅠ


일단 제가 원하는걸 더 설명드리면..
파싱하는 곳에서는 값 잘쓰고있잖습니까??
근데 파싱하는 곳에서 Gson으로 잘 파싱해서 데이터를 잘보관하고 있고!!
다른 클래스 어디든 그 값을 쓰고싶은데서 쏙쏙 빼서 쓰고싶은겁니다...
지금은 야매로 쉐어드프리퍼런스에 저장해서 쓰고있네요....

파싱하는곳에서 다 생성하고 선언하니... Gson이든 파서든 리스트든
다른 클래스에서 그걸 또 생성하고 쓰면 안될거같고
배열일지라도 get 메소스를 통해 가져다쓰고싶은데 어찌해야할지 모르겠어요 ㅜ
그렇게 하시려면 쉐어드프리퍼런스가 적당한 사용방법으로 보여지는데요..
안 쓰시려면, 전역 객체를 생성하고 거기에 넣어주던지 해야합니다.
그 '파싱하는 곳' 클래스 자체를 스태틱으로 선언해서 값을 주시면
어디서든지 접근이 가능하겠죠. 하지만 그런것 보다는
쉐어드프리퍼런스가 더 괜찮은 방법같아 보입니다.
그럼 파싱한 곳에서만 그 값에 접근해서 사용 가능한거고

다른곳에서 접근해서 쓰려면 쉐어드프리퍼런스 쓰는게 좋을거 같다는 말씀이시죠?? 지금 그렇게 사용중인데 그냥 써야(?)겠네요////
그 '파싱하는 곳' 이란곳이 어떤 클래스인지는 모르겠지만
Activity를 상속받은 클래스라면 intent를 이용하는게 좋아 보이구요.
그 외의 클래스라면 분명히 액티비티에서 가져가 쓸 일이 생길것이므로
쉐어드에 쓰셔도 될것 같습니다.
그런데, sheredpreference는 앱이 종료되어도 값을 남기고 싶은 경우 주로 사용하기 떄문에...
만약 앱이 종료되면 사라져도 관계 없는 값이라면, 이보다는 스태틱 클래스를 하나 선언해서 사용하시는게 더 좋을수도 있겠네요.
이는 개인적인 그... 의미상의 문제이고, 실제로 잘 사용하신다면 어떤걸 쓰셔도 상관 없습니다.
그게 아니고, 한번 받은 값을 앱 전반적으로 계속 쓰신다면
Sqlite 사용하셔도 될것 같습니다.
...