package com.android;
import java.io.BufferedReader;
import java.io.InputStream;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.res.AssetManager;
import android.content.res.AssetManager.AssetInputStream;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
public class JsonTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//asset 폴더의 내용을 가져오기
AssetManager assetManager = getResources().getAssets();
try{
//사용하고자 하는 json 파일 open
AssetInputStream ais = (AssetInputStream)assetManager.open("Json/home.json");
//stream을 리더로 읽기
BufferedReader br = new BufferedReader(new InputStream(ais));
//StringBuilder 사용
StringBuilder sb = new StringBuilder();
//json파일의 내용이 용량이 클경우 Stirng 의 허용점인 4096 byte 를 넘어가면 오류발생
int bufferSize = 1024 * 1024;
//char 로 버프 싸이즈 만큼 담기위해 선언
char readBuf [] = new char[bufferSize];
int resultSize = 0;
//파일의 전체 내용 읽어오기
while((resultSize = br.read(readBuf)) != -1){
if(resultSize == bufferSize){
sb.append(readBuf);
}else{
for(int i = 0; i < resultSize; i++){
//StringBuilder 에 append
sb.append(readBuf[i]);
}
}
}
// 새로운 문자열을 만들어서 내부 버퍼의 내용을 복사하고 반환한다.
String jString = sb.toString();
//JSONObject 얻어 오기
JSONObject jsonObject = new JSONObject(jString);
//json value 값 얻기
String title = jsonObject.getString("title").toString();
System.out.println("title : " + title); //출력값 NUGI_TEST
//JSONArray 사용법 -buttons
JSONArray btnJArr = new JSONArray(jsonObject.getString("buttos"));
//btnJArr 의 length
int btnLen = btnJArr.length();
//StringArray에 buttons 의 title 키의 value값을 담겠습니다.
String btnTitle [] = new String[btnLen];
//버튼이미지 IntegerArray에 담기-text_Img 도 같은방법이라 생략;
int btnImg [] = new int[btnLen];
for(int i = 0; i < btnLen; i++){
//buttons 의 값들중에 key 값이 title 인 value 뽑아오기
btnTitle [i] = btnJArr.getJSONObject(i).getString("title").toString();
//btnImg 담기
//package_name 은 자신의 프로젝트 패키지명을 다 넣어줘야합니다. java파일 맨위에 package 라고 되어있죠 그 뒷부분 전체
// getIdentifier(이미지명, 그려주기, 패키지네임); 이미지명에 substring 한 이유는 .png 가 들어가면 안되기에 잘라준겁니다.
btnImg [i] = getResources().getIdentifier(btnJArr.getJSONObject(i).getString("btn_img")
.substring(0, btnJArr.getJSONObject(i).getString("btn_img").indexOf(".")) ,"drawable", "package_name");
}
// gridId 에맞게 넣어주기 위해 선언
int gridId = 0;
for(int i = 0; i < btnLen; i++){
//xml 에서 ID 얻어오기
gridId = R.id.mainGrid01 + i;
//image set 위의 소스를 바로 넣어줘도 되지만 너무 길어서 담아서 넣었음.....요렇게 해주면 이미지가 쏘옥~
((ImageView)findViewById(gridId)).setImageResource(btnImg[i]);
}
//위와 같은 방법으로 lists도 담아주면되겠지요? 리스트 타입이기에 ListAdapter 를 사용하시면 됩니다.(강좌많으니 참고를...)
//lists 에 type 이 web 일경우 WebView 를 통해서 보여주면 되겠지요~
}
catch(JSONException je){
Log.e("jsonErr", "json에러입니당~", je);
}
catch(Exception e){
Log.e("execption", "파일이 없나봐용", e);
}
}
}
json 관련 오류 인데요
BufferedReader br = new BufferedReader(new InputStream(ais));
이부분이 계속 애러가 납니다..
BufferedReader 이 부분 () 안에는... FileReader("file.java") 이런걸 쓰라고 되 있던데...
위에서 그 파일 불러 오는 부분은 처리 해 줬는데도
애러가 나네요
고수 분들의 큰 도움 부탁 드립니다.
안녕하세요?
BufferedReader 객체를 생성할 때, 인자부분이 잘못된 거 같습니다.
다음과 같이 고쳐보세요.
먼저 import java.io.InputStreamReader; 를 코드에 추가하세요.
그리고
BufferedReader br = new BufferedReader(new InputStream(ais));
--> BufferedReader br = new BufferedReader(new InputStreamReader(ais));
로 인자 부분을 수정하고 실행해 보시길 바랍니다.