펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


JSONObjectJSON형태의 데이터를 관리해 주는 메서드이다.

주의점은 맵의 특성으로 인해 순서를 보장하지 않는다는것. 즉 똑같이 뽑아내도 내용물의 순서가 섞일 수 있다.



간단한 사용법은 다음과 같다.


먼저 제이슨 생성 후 데이터 집어넣기


JSONObject obj = new JSONObject();

obj.put("이름","덩치");

obj.put("거주지","서울");


출력해보면


String data = obj.toString();

System.out.println(data);


결과값 - {"이름":"덩치","거주지":"서울"} 

이렇게 표시된다.


키값에 해당하는 벨류만 뽑고싶다면

String data = obj.get("key");

하면 "key"에 해당하는 벨류를 반환한다.



JSON형태의 StringJSONobject에 넣는법은


String data = {"이름":"덩치","거주지":"서울"};

(실제로는 자바에서는 "를 못읽기때문에  String data = "{\"이름\":\"덩치\",\"거주지\":\"서울\"}";  이런식으로 해줘야 될것임)

JSONObject obj = new JSONObject(data);

쓸때는 위와 같이 뽑아서 사용하면 된다.



JSONArray 는 JSONObject가 들어가는 배열이라고 보면 된다.


예제를 먼저 보자

- 예제출처 : (http://aroundck.tistory.com/215)


String Json = "[{\"Product\" : \"Mouse\", \"Maker\":\"Samsung\", \"Price\":23000},"
               + "{\"Product\" : \"KeyBoard\", \"Maker\":\"LG\", \"Price\":12000},"
               + "{\"Product\":\"HDD\", \"Maker\":\"Western Digital\", \"Price\":156000}]";
try{
   String result = "";
   JSONArray ja = new JSONArray(Json);
   for (int i = 0; i < ja.length(); i++){
      JSONObject order = ja.getJSONObject(i);
      result += "product: " + order.getString("Product") + ", maker: " + order.getString("Maker") +
                  ", price: " + order.getInt("Price") + "\n";
   }
}
catch (JSONException e){ ;}


결과값 :   result : product: Mouse, maker: Samsung, price: 23000
product: KeyBoard, maker: LG, price: 12000
product: HDD, maker: Western Digital, price: 156000

이렇게 만들어진 JSONArray 객체를 JSONObject에 넣을 수 있으며

위와같은 방식으로 제이슨오브젝트에 그냥 오브젝트와 어레이를 모두 넣어가며
작업할 수 있다.






'Android > 입/출력' 카테고리의 다른 글

기본적인 JSONObject, JSONArray 사용법  (3) 2014.03.21
SharedPreferences 사용법을 알아보자.  (1) 2014.01.14

댓글을 달아 주세요

  1.  댓글주소  수정/삭제  댓글쓰기 2016.08.05 03:32

    비밀댓글입니다

  2.  댓글주소  수정/삭제  댓글쓰기 ming 2016.09.30 11:33

    잘읽어 보았습니다.
    좋은 정보 감사합니다.

    궁굼한점이 하나있는데요,
    JSON 데이터가 {"friday":[{key:value,key1:value1}, {key:value,key1:value1}],
    [{key:value,key1:value1}, {key:value,key1:value1}]}
    이런식으로 온다 가정했을때, JSONArray 에 들어갈수있나요?

  3.  댓글주소  수정/삭제  댓글쓰기 ㅇㅇㅇㅇ 2018.08.11 13:57

    try{
    String result = "";
    JSONArray ja = new JSONArray(Json);
    for (int i = 0; i < ja.length(); i++){
    JSONObject order = ja.getJSONObject(i);
    result += "product: " + order.getString("Product") + ", maker: " + order.getString("Maker") +
    ", price: " + order.getInt("Price") + "\n";
    }
    }
    catch (JSONException e){ ;}

    예제 에러나고 실행되지 않습니다....

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


작업을 하다가 바이트로 저장된 .dat파일을 수정할 일이 생겼다.


아예 파일을 다시 생성해버릴까 하다가 멘탈을 다잡고 생각해 보니 생각보다 간단한문제였다.


먼저 파일을 열어야 하는데


static public byte [] openUploadPacket(Context ctx, String name) {

String filename = name + "_packet.dat" ;

byte [] list = null ;

try {

File cellFile = ctx.getFileStreamPath(filename);

ObjectInputStream is = new ObjectInputStream(new FileInputStream(

cellFile));

list = (byte []) is.readObject();

is.close();

return list;

} catch (Exception e) {

log.err("openUploadPacket = " + e) ;

return null;

}

}


이렇게하면 바이트배열에 파일의 내용이 전부 들어간다.


( 파일을 저장하는것은 InputStream 대신 OutputStream을 사용해서 write해주면 된다. )



나는 오픈한 파일의 164 ~ 175 번 값을 바꿔줘야 했다.



byte [] packet = Common.openUploadPacket(mContext, workNum) ;

byte [] editByte = et_nis.getText().toString().getBytes();


for (int i = 0; i < editeByte.length; i++) {

packet [164 + i] = editeByte[i];

}


먼저 바이트배열 packet에 파일 읽어온다

그럼 파일의 length만큼 배열크기가 할당되고 데이터가 들어가고,


내가 수정할 데이터가 들어갈 editByte도 하나 만들어줬다.


et_nis라는 EditView에 입력한 값이 저기에 들어가게 될텐데,


et_nis에 어떤 데이터형이 들어갈 지 모르기때문에 일단 스트링으로 받은 다음, getBytes()를 이용해

바이트형식으로 배열에 넣어줬다.


그리고 164번부터 et_nislength만큼 반복을 돌려서 기존 packet 배열에 수정할 데이터 배열을 넣어준다


위와같이 하면 원하는 길이만큼 원하는 데이터로 수정해 줄 수 있다.


소켓통신할 때 자주 사용될 것 같다




댓글을 달아 주세요

Android/기본스킬 | Posted by 덩치 2013. 12. 31. 10:33

자바/안드로이드 HashMap 사용법

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

HashMap은 Map인터페이스의 한 종류로, key와 value 한 쌍을 데이터로 가진다.

쉽게 이해하려면 리스트 형태에 값을 키와 벨류로 가지고 있다고 생각하면 된다.

리스트와의 큰 차이점은 위에처럼 키값을 가진다는것이고, 또 순서를 보장하지 않는다는점이다.

순서대로 입,출력이 되고 순서에 의해 자료를 처리하는 작업에는 알맞지 않다.

입력된 key값을 이용해 value를 구하며(리스트에서 인덱스를 이용해 벨류를 구하는 이치)

key값은 중복되지 않으며 value는 중복 가능하다.


즉, key값으로 1을 5번 입력한다면 맨 처음의 key,value만 입력되고 나머지는 입력되지 않아

이 특성을 잘 이용하면 중복검사를 매우 편하게 할 수 있다.


HashMap의 기본적인 사용법을 알아보겠다.


HashMap<Integer, String> map = new HashMap<Integer, String>();


입력 -

map.put(1, "치킨");

map.put(2, "피자");

map.put(3, "탕수육");


출력 -

Iterator<Integer> iter = map.keySet().iterator();

while(iter.hasNext()) {

int key = iter.next();

String value = map.get(key);

Log.d("fureun", "key : " + key + ", value : " + value);

}

이렇게 하면 모든 키와 벨류 쌍이 다 출력된다.


다른 사용법으로는 map.get(1);을 하면 키 1에 대응하는 value "치킨"이 반환된다.


if(map.containsKey(1)) {


}

이렇게 하면 키값 1이 존재할 경우 true가 반환된다.


이외에도 활용법은 엄청 많으니, 공부를 통해 자신이 원하는 형태로 사용 할 수 있도록 노력하자.


댓글을 달아 주세요

  1.  댓글주소  수정/삭제  댓글쓰기 Len 2017.02.10 16:35

    제 깃헙에 퍼가겠습니다! 좋은 자료 감사합니다 : )

    https://github.com/LenKIM/TIL_Today_I_Learned

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

public static byte[] shortToByte(short a) {

byte[] shortToByte = new byte[2];

shortToByte[0] |= (byte)((a & 0xFF00) >>> 8);

shortToByte[1] |= (byte)(a & 0xFF & 0xff);

return shortToByte;

}  

   public static byte[] intToByte(int a) {  

     byte[] intToByte = new byte[4];     

     intToByte[0] |= (byte)((a&0xFF000000)>>24);     

     intToByte[1] |= (byte)((a&0xFF0000)>>16);     

     intToByte[2] |= (byte)((a&0xFF00)>>8);     

     intToByte[3] |= (byte)(a&0xFF);   

     return intToByte;  

   }  


-끝-

댓글을 달아 주세요

Android/Compile | Posted by 덩치 2013. 10. 21. 17:17

apk파일 디컴파일하기

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

apk파일을 디컴파일하게되면 원본 소스코드를 100%는 아니더라도 확인이 가능하다.

다만, 소스코드 난독화(proguard등)가 적용되어 있다면 코드의 해석은 상당히 힘들게된다.

그럼에도 불구하고 필요한 소스코드가 있다면 디컴파일하여 쓸만한 건덕지를 찾아봐야하니 디컴파일은 중요하다고

할 수 있다. (개발자의 경우 상당히 기분나쁜부분, 우리는 참고용으로만 사용하자)

디컴파일 전에 몇가지 준비사항이 필요하다.


1. https://code.google.com/p/dex2jar/downloads/list 

여기서 dex2jar 다운로드 > 

C:\Program Files\adt-bundle-windows-x86_64-20130522\sdk\platform-tools\dex2jar-0.0.9.15 경로에 압축해제 

(위 경로는 본인의 경우이고, sdk가 있는 경로상에 집어넣어주면 된다.)

dex2jar.bat 파일 우클릭 후 편집 > echo off 를 echo on 으로 수정



2. http://varaneckas.com/jad/

여기서 최신버전 Jad (자바 디컴파일러) 다운로드 > 압축해제


이제 디컴파일 준비는 끝났다.


시작




- 우선 디컴파일할 apk파일의 확장자를 apk 에서 zip로 바꾸면 zip파일이 된다.

- 압축해제하면 classes.dex 파일이 나온다. 이것만 있으면 된다






그렇게 나온 classes.dex 파일을

아까 받은 dex2jar 폴더로 이동시킨다





그리고 현재 위치의 경로를 복사 한 뒤

시작 > 실행 > cmd > cd적은다음 한칸띄고 마우스 우클릭 > 붙여넣기 > 엔터 하면

위의 경로로 이동





이제 d2j-dex2jar.bat classes.dex를 적고 엔터를 누르면 사진과같이 이상한글이 쫘르륵 나오고

경로에 classes-dex2jar.jar 파일이 생성된다.

버전에 따라 d2j-dex2jar.bat가 아니라 dex2jar.bat 인경우도 있는듯 하니 파일명을 잘보고 알아서 입력한다


그리고 생성된 파일을 압축해제하면 클래스파일들이 나오게 된다.




필자는 proguard를 적용한 apk를 사용했기때문에 보는바와같이 클래스명이 저렇게 지맘대로다.

이제 MainActivity.class를 java파일로 변환해줘야 소스코드를 확인할 수 있다.


MainActivity.class파일을 복사하여 2번에서 설치한 Jad가 설치된 경로에 붙여넣어준다





그리고





다시 시작 > 실행 > cmd > jad 경로로 이동 후


jad -o -sjava MainActivity.class  엔터




그러면 이렇게 MainActivity.java 파일이 생긴다 ! 실행해보자




다시말하지만 필자는 코드난독화(proguard)를 적용했기에 변수명이 이렇게 알아먹기 힘들게 표시된다.

(적용하지 않으면 대부분의 소스코드를 볼 수 있다)

오랜시간 해석한다면 불가능하진 않지만 상당한 곤욕을 치루는것은 어쩔 수 없다.


proguard에 관한 포스팅은 이전글을 참고하길 바라며


-끝-

댓글을 달아 주세요

  1.  댓글주소  수정/삭제  댓글쓰기 수란 2014.01.17 16:13

    정말 멋진 정보입니다!

  2.  댓글주소  수정/삭제  댓글쓰기 2014.07.20 19:06

    classes.dex 파일을 jar파일로 바꾸는 데 까진 성공했습니다
    jar파일이 생성되고
    jar파일을 여는순간 에러가 뜨고
    jd-gui로도 안열리면 어떤게 문제인가요?

  3.  댓글주소  수정/삭제  댓글쓰기 2015.02.05 17:48

    혹시 apk를 zip으로 했다가 풀어도 똑같이 apk로 나오는데 어떻게해야할가요?

  4.  댓글주소  수정/삭제  댓글쓰기 오호 2015.11.22 19:42

    탱큐탱큐
    근데 일쿠는 보안이 너무 강해서....ㅠㅠㅠㅠㅠㅠㅠ

  5.  댓글주소  수정/삭제  댓글쓰기 자료는 좋은데 2016.01.14 09:39

    본인도 출처를 좀 달고 정리하시죠.. 어디서 보고 했을꺼 아닌가요..?

  6.  댓글주소  수정/삭제  댓글쓰기 진짜 감사8시간 동안 뻘짓 2016.01.30 20:58

    감사감사감사감사감사감사 정말 감사요 진작에 밧어야하는건대ㅔ

  7.  댓글주소  수정/삭제  댓글쓰기 blueasa 2016.07.29 14:03 신고

    좋은 정보 감사합니다. :)

  8.  댓글주소  수정/삭제  댓글쓰기 gg 2017.04.04 23:46

    좋은 정보 감사합니다!! 퍼갈게요!!

  9.  댓글주소  수정/삭제  댓글쓰기 Jv 2017.11.24 16:56

    너무너무 감사합니다!!