지식메모/JAVA

참고링크


http://blog.naver.com/battledocho/220035925900



이런 Json배열 하나에 여러개의 Json이 있다고 가정했을 때


Json 값마다 있는 idx,link,description 키값을 사용해 데이터를 저장해보았다.

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
String eventArray = null//Json Array를 String으로 저장하기 위한 변수 선언
try {
    eventArray = loadHtml(); //loadHtml()는 Json Array를 파싱해서 String으로 가져오는 함수라 가정
catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println("결과물 : " + eventArray);
try {
    JSONArray array = new JSONArray(eventArray); //JSONArray형식으로 파싱하기 위해 새로 선언해주며 eventArray를 집어 넣어준다.
    list_cnt = array.length(); //Json 배열 내 JSON 데이터 개수를 가져옴
 
    //key의 value를 가져와 저장하기 위한 배열을 생성한다
    getDescription = new String[list_cnt]; //decription 저장용
    getLink = new String[list_cnt]; //link 저장용
    getImageUrl = new String[list_cnt]; //imageUrl 저장용
 
    for (int i = 0; i < list_cnt; i++) { //JSONArray 내 json 개수만큼 for문 동작
 
        JSONObject jsonObject = array.getJSONObject(i); //i번째 Json데이터를 가져옴
        getDescription[i] = jsonObject.getString("description");  //descripton 값을 배열에 저장
        getLink[i] = jsonObject.getString("link");  //link 값을 배열에 저장
        getImageUrl[i] = jsonObject.getString("imageUrl");  //imageurl 값을 배열에 저장
        Log.i("JSON Object", jsonObject + "");
        Log.i("JsonParsing", getDescription[i] + "," + getLink[i] + "," + getImageUrl[i]);
 
    }
cs


Log로 찍어보면

JsonObject의 로그

I/JSON Object: {"idx":15858,"imageUrl":"http:\/\/img.cgv.co.kr\/Event\/Event\/2017\/0330\/some_240x200_01.jpg","link":".\/detail-view.aspx?idx=15858&menu=2","description":"<어느날>1+1 예매 이벤트"}


파싱해낸 데이터 description, link, imageUrl 순으로 파싱이 된 걸 볼 수 있다.

I/JsonParsing: <어느날>1+1 예매 이벤트,./detail-view.aspx?idx=15858&menu=2,http://img.cgv.co.kr/Event/Event/2017/0330/some_240x200_01.jpg


배열에 잘 들어갔는지 description을 예로 확인을 해보면

for(int i=0;i<description.length;i++){
System.out.println("배열값 : "+description[i]);
}


I/System.out: 배열값 : <시간위의 집>스타★라이브톡

I/System.out: 배열값 : <보통사람>1+1 예매권 2차 이벤트

I/System.out: 배열값 : <로즈> 기대평 이벤트

I/System.out: 배열값 : <공각기동대:고스트 인 더 쉘>예매 경품 이벤트


description 값만 따로 배열에 잘 들어가있음을 확인할 수 있다.


이제 파싱해낸 값으로 다양한 곳에 쓸 수 있다.



  1. 2018.01.22 23:10

    비밀댓글입니다

    • yonoo88 2018.01.23 18:32 신고

      안녕하세요. 저도 오래전 코드라 기억이 잘 나질 않네요. 개발이 일이 아닌터라 코드는 저게 전부여서요. 도움이 못되어서 죄송합니다.

subString 함수사용

subString(시작위치,끝위치);

예를 들어 애국가에서 

하느님이 ~ 우리나라만세 사이에 텍스트를 추출하고 싶다면

String song = "하느님이 보우하사 우리나라만세";

int start = song.indexOf("하느님이"); //하느님이 위치 추출

int end = song.indexOf("우리나라만세"); //우리나라만세 추출

String parseText = song.subString(start,end);

이런 방법도 있다





또 이상한 에러가 발생.. 이클립스가 이상한건가..

에러 내용은 이러하다

java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package

at java.lang.ClassLoader.checkCerts(ClassLoader.java:895)

at java.lang.ClassLoader.preDefineClass(ClassLoader.java:665)

at java.lang.ClassLoader.defineClass(ClassLoader.java:758)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)

at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)

at java.net.URLClassLoader.access$100(URLClassLoader.java:73)

at java.net.URLClassLoader$1.run(URLClassLoader.java:367)

at java.net.URLClassLoader$1.run(URLClassLoader.java:361)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:360)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

at NaverAPITest.NAPITest.test.test(test.java:35)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:483)

at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)

at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)

at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)

at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)

at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)

at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)

at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)

at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)

at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)

at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)

at org.junit.runners.ParentRunner.run(ParentRunner.java:363)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)



찾아보니 라이브러리 중복으로 인해 발생된다고 한다.

Junit의 라이브러리가 문제라는데..

org.hamcrest.Matchers

아무튼 JUnit4 저걸 통째로 remove하여 제거하였다.


그리고 다시 실행했더니 웬 에러???

pom.xml을 가봤더니 Junit 3.8.1 로 되어있었다. 


그래서 저걸 지워버리고

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.12</version>

</dependency>

이걸 추가해주었더니 에러가 사라졌다!

이제 실행하니 잘되었따







자바에서 프로그램을 만든 뒤 프레임바 아이콘을 바꾸고 싶었다.


바로 요놈을 바꿔주고 싶었다.





그래서 프로젝트 내 이미지 파일을 복사한 뒤 아이콘을 변경하기로 했다.




icon 폴더 생성 후 p.png 파일을 넣었다.


그런다음


ImageIcon img = new ImageIcon("icon/p.png");

        win.setIconImage(img.getImage());



이렇게 코드를 넣어주고 실행하면 변경됐으나 


 Runnable JAR 즉 실행가능한 JAR 파일로 생성하여 실행하면 변경되지가 않았다.


왜 jar 파일로만 생성하면 안되는 걸까해서 찾아본 결과 이미지가 있는 폴더도 같이 묶어주어야 했다.




먼저 프로젝트 우클릭 > properties 에 들어간 뒤 Java Build Path 에 들어간다.


Source 탭에서 Add Folder 를 선택한다.






그런다음 이미지가 있는 폴더를 체크해준다.

여기서는 icon 폴더





적용한 다음 저 위치의 경로를 추출하기 위해 다음 코드를 써준다.


1
2
3
4
 URL imageURL = 클래스명.class.getClassLoader().getResource("p.png");
 ImageIcon img = new ImageIcon(imageURL);
 JFrame객체.setIconImage(img.getImage());
 
cs



이렇게 해주면 프레임바 아이콘이 교체된다.

한번 이클립스에서 실행해보고 적용됐는지 확인해본다.





적용한 다음 프로젝트 우클릭 > Export > Java > Runnable JAR file 선택













Launch configuration 에서 실행될 클래스 지정해주고


Library Handling 에서 두번째 선택한 뒤 finish 해준다.


이유는 모르겠으나 두번째로 해야 적용이 되었다.








그리고 생성된 jar 파일을 실행해보고 아이콘이 바뀌었나 확인해본다.


그럼 어느 컴퓨터를 가도 아이콘은 적용되어 있을 것이다.














ImageIcon img = new ImageIcon("이미지경로");

해당프레임.setIconImage(img.getImage());




현재 프로젝트에 lib 폴더가 있고 start.exe 파일을 참조하게 하고 싶다면



File path = new  File("lib"+File.separator+"start.exe");



이렇게 해주면 된다.

그런데 프로젝트 실행할 땐 잘되는데 실행가능한 jar 파일로 export 하여 해보니 안된다..ㅠㅠ






자바 스윙에서 JTextArea 에서 스크롤바 자동으로 설정하는 방법


1
2
3
4
5
6
JTextArea area= new JTextArea();
JScrollPane scrollPane = new JScrollPane(area);  //스크롤판 추가
JPane.add(scrollPane); //화면에 추가
 
area.append(log);  // 출력로그 JTextArea 출력
area.setCaretPosition(txtLog.getDocument().getLength());  // 이 코드를 append 밑에 추가해주면 항상 아래로 스크롤 된다
cs





자바 스윙에서 JPasswordField 필드를 사용하면 암호입력시 * 별표로 표시할 수 있는데 이 가려지 값을 가져오는 방법



tf_pw = new JPasswordField();       
tf_pw.setEchoChar('*');



이런 식으로 암호 입력시 * 별표로 가려지게 한다음



 String pw = "";
  
//tf_pw 필드에서 패스워드를 얻어옴, char[] 배열에 저장
char[] secret_pw = tf_pw.getPassword(); 

//secret_pw 배열에 저장된 암호의 자릿수 만큼 for문 돌리면서 cha 에 한 글자씩 저장
     for(char cha : secret_pw){         
         Character.toString(cha);       //cha 에 저장된 값 string으로 변환
       //pw 에 저장하기, pw 에 값이 비어있으면 저장, 값이 있으면 이어서 저장하는 삼항연산자
         pw += (pw.equals("")) ? ""+cha+"" : ""+cha+"";   
     }



이렇게 저장한 후 System.out.println(pw)로 찍어보면 입력된 암호가 나타난다.




해당링크

http://dextto.tistory.com/180



핵심 키워드 \D+


문자열 배려 첫번째는 공백이므로 split[1] 값 부터 사용하기


특히 특수문자 검색할 땐 앞에 백슬래쉬 요거 \ 추가하기


ex) ""이름"" ( 에러뜸 ) ▶ "\"이름\"" ( 따옴표도 검색가능 )


+ Recent posts

티스토리 툴바