gson으로 데이터를 개별적으로 갖고오고 싶은 경우
예를 들어
{
"isExist": false,
"data": [
{
"isbn": "8990245575 9788990245571",
"book_name": "긍정탐구(AI) 조직변화(사례위주의 알기 쉬운 실무 AI 가이드 북)",
"author": [
"Frank J Barrett",
"Ronald E Fry"
],
"contents": "『긍정탐구(AI) 조직변화』는 조직학습과 변화에 대한 간단하면서도 파격적인 철학을 제시한다. 즉, 인간 시스템의 협력역량에 생명력을 불어넣는 모든 것을 발견하고, 발산하라는 것이다.",
"thumbnail": "https://search1.kakaocdn.net/thumb/R120x174.q85/?fname=http%3A%2F%2Ft1.daumcdn.net%2Flbook%2Fimage%2F1317696%3Ftimestamp%3D20190127193635"
}
]
}
여기서 isExist만 갖고오고 싶다면
Call<IsExist> 이렇게 데이터모델 따로 만들어서 얘만 가져오면 됨.
IsExist 모델엔 Boolean isExist 하나만 있겠지.
http://jsonplaceholder.typicode.com/comments/?postId=1
여기서 데이터 가져온다.
0. build.gradle에 추가
implementation 'com.squareup.retrofit2:retrofit:2.1.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1' |
1. ApiService 인터페이스 만들기
public interface ApiService { public static final String API_URL = "http://jsonplaceholder.typicode.com/"; @GET("comments") Call<ResponseBody>getComment(@Query("postId") int postId); @POST("comments") Call<ResponseBody>getPostComment(@Query("postId") int postId); @GET("comments") Call<ResponseBody>getComment(@Query("postId") String postId); @FormUrlEncoded @POST("comments") Call<ResponseBody>getPostCommentStr(@Field("postId") int postId); } |
2. NetworkManager 클래스 만들기
public class NetworkManager{ private static Retrofit retrofit; private static ApiService apiService; private static Retrofit buildRetrofit(){ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); return new Retrofit.Builder() .client(client) .baseUrl(ApiService.API_URL).build(); } private static Retrofit getRetrofit() { if (retrofit==null){ retrofit = buildRetrofit(); } return retrofit; } public static ApiService getApiService(){ if (apiService==null){ apiService = getRetrofit().create(ApiService.class); } return apiService; } } |
return new Retrofit.Builder()
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(ApiService.API_URL).build();
3. Data 클래스 만들기 (postId ~ body 저장하기 위한)
public class Data { //json 파싱 int postId; int id; String name; String email; String body; public String toString() { String s = ""; s += postId + "/"; s += id + "/"; s += name + "/"; s += email + "/"; s += body + "/"; return s; } public int getPostId() { return postId; } public void setPostId(int postId) { this.postId = postId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } } |
4. MainActivity.java (데이터 파싱하고 싶은 액티비티)에 추가
Call<ResponseBody> comment = NetworkManager.getApiService().getComment(1); comment.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { try { String result = response.body().string(); Log.v("Test", result); //받아온 데이터 try { JSONArray jsonArray = new JSONArray(result); data = new Data(); for (int i = 0 ; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); data.setPostId(jsonObject.getInt("postId")); data.setId(jsonObject.getInt("id")); data.setName(jsonObject.getString("name")); data.setEmail(jsonObject.getString("email")); data.setBody(jsonObject.getString("body")); //dataArrayList.add(data); text.setText(data.toString()); Log.v("Test", jsonObject.toString()); } } catch (JSONException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { } }); |
5. activity_main.xml 에는 다음 textview가 있음. 여기에 데이터 파싱! (근데 위 코드는 맨 마지막 데이터만 텍스트에 표시된다..ㅎㅎ 이건 알아서 다시 고쳐보기
<TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="40dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:text="오늘은 뭘 읽어볼까?" android:textSize="35dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/btn_my" /> |
gson은 json과 다르게 ResponseBody를 안써도 되는듯?
gson이용하면!
0. build.gradle에 추가
implementation 'com.squareup.retrofit2:converter-gson:2.1.0' //gson 추가한거임 implementation 'com.squareup.retrofit2:retrofit:2.1.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1' |
1. ApiService 인터페이스 만들기
public interface BookApiService { /** * 모든 API에 * accessToken, idToken, refreshToken * 필드를 추가해사 보내주세요!! */ // @FormUrlEncoded // @GET("tags") // Call<ResponseBody> getTags(@Field("accessToken") String accessToken, // @Field("idToken") String idToken, // @Field("refreshToken") String refreshToken); @GET("tags/") Call<List<Tag>> getTags(); //아까랑 다른점은 ResponseBody가 아니라 List<Tag> 라는 점! } |
2. NetworkManager 클래스 만들기
package org.techtown.just.network; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class NetworkManager { private static final String API_URL = "https://82uym5oh19.execute-api.ap-northeast-2.amazonaws.com/dev/"; private static Retrofit retrofit; private static LoginApiService apiServiceLogin; private static BookApiService bookApiService; private static Retrofit buildRetrofit() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); return new Retrofit.Builder() .client(client) .addConverterFactory(GsonConverterFactory.create()) .baseUrl(API_URL).build(); } private static Retrofit getRetrofit() { if (retrofit == null) { retrofit = buildRetrofit(); } return retrofit; } public static LoginApiService getLoginApi() { if (apiServiceLogin == null) { apiServiceLogin = getRetrofit().create(LoginApiService.class); } return apiServiceLogin; } public static BookApiService getBookApi() { if (bookApiService == null) { bookApiService = getRetrofit().create(BookApiService.class); } return bookApiService; } } |
빨간글씨가 추가됨.
3. Tag 클래스 추가
package org.techtown.just.model; public class Tag { int tag_id; String tag_name; @Override public String toString() { return tag_id + " : " + tag_name; } public int getTag_id() { return tag_id; } public void setTag_id(int tag_id) { this.tag_id = tag_id; } public String getTag_name() { return tag_name; } public void setTag_name(String tag_name) { this.tag_name = tag_name; } } |
4. TagsActivity.java (데이터 파싱하고 싶은 액티비티)에 추가
package org.techtown.just; import android.app.Activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.TextView; import android.widget.Toast; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.techtown.just.model.Post; import org.techtown.just.model.Tag; import org.techtown.just.network.NetworkManager; import java.io.IOException; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; public class TagsActivity extends AppCompatActivity { @BindView(R.id.text) TextView text; Tag tag; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tags); ButterKnife.bind(this); Call<List<Tag>> list = NetworkManager.getBookApi().getTags(); list.enqueue(new Callback<List<Tag>>() { @Override public void onResponse(Call<List<Tag>> call, Response<List<Tag>> response) { List<Tag> tags = response.body(); text.setText(tags.get(2).toString()); } @Override public void onFailure(Call<List<Tag>> call, Throwable t) { Toast.makeText(TagsActivity.this, "오류가 발생했습니다.", Toast.LENGTH_SHORT).show(); } }); } } |
참고링크
'Solve Problem > Android' 카테고리의 다른 글
[Android] RecyclerViewAdapter에서 Intent 호출 (2) | 2019.01.25 |
---|---|
[Android/Git] GitKraken 이용법 - commit/push/merge/branch (0) | 2019.01.19 |
[Android] Fragment 적용 방법 (0) | 2019.01.08 |
[Android] Activity 전환 시 객체 전달하기! : Parcelable, Serializable (2) | 2019.01.06 |
[Android] Checkbox event 체크박스 이벤트 - 체크박스 선택되었을 때 (0) | 2019.01.06 |