티스토리 뷰

앱을 찍어낸다고 하고는 뜸한게 이상할거 같은데, DJBOX라는 백엔드 프로그램을 만들고 있습니다.

개인시간을 쪼개서 개발하는것이라 빨라야 이번 장마시즌이나 연말에 나올꺼 같네요. ^-^;

뭐하고 있는지 근황이 궁금하신분이 있을까봐, 살짝 개발중인 코드에서 일부기능을 공개하려고 합니다.

그건 바로... 자바에서 사용가능한 JSON파서 DJson입니다. 

 

 

history------------------------------------------------------------------------------------------------

2013.03.16 : 0.9a 공개 (부동소숫점형 숫자 파싱추가, 예: 1.12e2형태, 파일읽기에서 BOM캐릭터 제외기능) 




2013.03.11 : v0.8a 공개 (add(item), put(key,val) 기능추가)    

2013.03.11 : v0.8 공개 (실수데이터에서 0.23456e2 표현 미지원 0.9버전에서 추가예정)

2013.03.10 : 베타버전 공개 및 테스트 케이스 보강완료

2013.03.08 : 기본 필수 파싱 기능구현

2013.03.01 : 개발시작

------------------------------------------------------------------------------------------------------

 




A. DJson 파서의 특징

파싱은 한줄이면 되고, 데이터 타입도 기본타입에 친숙한 구조로 되어있습니다.

제가 만든 컨셉은 "미친듯이 쉽게" 입니다.

Gson도 편해서 많이 쓴다고 하는데 저는 샘플코드 보다가 실제 사용해보기엔 부가적인 코드가 많다고 느꼈습니다.

그래서 데이터 타입을 기본타입들로 제한하여 사용하기 쉽게 했습니다.


가장큰 장점이라면 Jquery에서 selector라는 개념이 있는데... 

이와 유사한 기능으로 find() 라는 기능을 넣었습니다. (상세한건 "D. 활용예제"에서 적겠습니다)

(부가설명을 하자면 Djson.parse(obj)에서 String형이 아닌 File이나 Url에서 읽도록 기본지원됩니다.)


B. 간단한 문법 / 소개

자바에서 json을 쓰려면 어떻게 해야할까요? 

json파서를 써야합니다. 제가 소개하려는 DJson에서는 어떻게 쓰는지 코드를 볼까요?

파싱하는 사용법은 아주 간단합니다.

Var variable = Djson.parse(json);    // json은 JSON문자면 됨.


특이한거라면 Var이라는 타입으로 리턴됩니다.

이 클래스는 사실 String, List, Map, Boolean, Long, Double 을 담을수 있게 해둔 클래스입니다.

눈치빠른분은 자바스크립트에서 개념을 차용한것을 알 수 있습니다.

Var var = new Var(123);

System.out.println(var.isType());            // => NUMBER

System.out.println(var.toInt() == 123);   // => true

System.out.println(var.toInt());               // => 123

System.out.println(var.toString());           // =>123


참고로 isType()의 경우는 ENUM으로 정의해두었습니다 ("net.indf.djbox.json.DataType")

NUMBER, STRING, BOOLEAN, NULL, MAP, LIST 값이 있습니다.

이제 실제 예제로 들어가 볼까요?





C. 샘플코드 (기본)

import net.indf.djbox.json.Djson;

import net.indf.djbox.json.Var;


public class DjsonSample1 {

          public static void main(String[] args) {

                    Var number = Djson.parse("123");

                    Var bool   = Djson.parse("true");

                    Var string = Djson.parse("\"asdf\"");


                    System.out.println("====  type check ====");

                    System.out.println(number.isType());

                    System.out.println(bool.isType());

                    System.out.println(string.isType());


                    System.out.println("====  result check ====");

                    System.out.println(number.toInt());

                    System.out.println(bool.toBoolean());

                    System.out.println(string.toString());

}

}


/*[output]

====  type check ====

NUMBER

BOOLEAN

STRING

====  result check ====

123

true

asdf

*/


네 아주 간단합니다.

Var이라는곳은 해당되는 값이 허용된다면 toString(), toInt(), toLong(), toDouble(), toBoolean() 으로 값을

바로 불러올수 있습니다. 당연히 map, list인 경우  toMap() , toList() 도 지원이 됩니다.





D. 활용예제 

여기서는 Djson의 최대 장점인 find() 메소드도 쓴 예제를 보여드릴게요.

티스토리의 댓글보기 API 샘플을 보고 사용하려고 합니다.

http://www.tistory.com/developer/apidoc/comment.php#comment-newest


(JSON원본)

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
    "tistory":{
        "status":"200",
        "item":{
            "url":"http://oauth.tistory.com",
            "secondaryUrl":"",
            "comments":{
                "comment": [
                    {
                        "id":"8176926",
                        "date":"1303796900",
                        "postId":"4",
                        "name":"Tistory API",
                        "homepage":"http://oauth.tistory.com",
                        "comment":"비루한 글에 칭찬을 하시니 몸둘바를 모르.. 지 않아!",
                        "open":"Y",
                        "link":"http://oauth.tistory.com/4#comment8176926"
                    },
                    {
                        "id":"8176923",
                        "date":"1303796801",
                        "postId":"4",
                        "name":"글쎄 요",
                        "homepage":"http://shesgone.com",
                        "comment":"제 홈에 와서 구경해보세요^_^",
                        "open":"N",
                        "link":"http://oauth.tistory.com/4#comment8176923"
                    },
                    {
                        "id":"8176918",
                        "date":"1303796711",
                        "postId":"4",
                        "name":"지나다가",
                        "homepage":"http://someurl.com",
                        "comment":"좋은 글 감사합니다.",
                        "open":"Y",
                        "link":"http://oauth.tistory.com/4#comment8176918"
                    }
                ]
            }
        }
    }
}


여기서 댓글에서 "id", "comment" 만 출력하고 싶다고 가정할게요.

DJson에서는 어떻게 하면 될까요?

find()라는 함수가 있어서 아주 심플합니다. (주황색 코드참고)


Var var = Djson.parse(jsonstring);

Var comment = var.find("tistory.item.comments.comment");

int commentCount = comment.size();


for(int i=0; i<commentCount; i++) {

      System.out.println(String.format("[%d] id=%d, comment=%s", i, comment.get(i).get("id").toInt(),    comment.get(i).get("comment")));

}


/* output

[0] id=8176926, comment=비루한 글에 칭찬을 하시니 몸둘바를 모르.. 지 않아!

[1] id=8176923, comment=제 홈에 와서 구경해보세요^_^

[2] id=8176918, comment=좋은 글 감사합니다. 

*/



find() 함수에서는 배열 인덱스까지 접근되도록 구현했습니다.

즉... 이런 문법도 사용가능합니다. (주황색 코드참고)

Var var = Djson.parse(jsonstring);

System.out.println(var.find("tistory.item.comments.comment[1].comment"));;


/* output

제 홈에 와서 구경해보세요^_^

*/




E. 마치며 

어때요? 초보자도 쉽게 쓸수 있는 컨셉으로 파서를 직접 만들었습니다.

일부러 딴 파서 구성에 영향을 받을까봐... 직접 사용인터페이스나 구조를 따로 잡아서 구현했습니다.

그리고 맘에 드는데 수정하고 싶다고 디컴파일하거나 그러지 마세요.


참고로 해당 코드는 완성되면 Github에도 올려서 공개할 예정입니다. 

아직 버그FIX를 더 해야할거 같아서 소스공개는 안하고 있고... 버그 발견하시면 꼭 문의 주세요 !!!






담당개발 : 정선생  ( tost@indf.net ) 



댓글
최근에 올라온 글
싸다구
최근에 달린 댓글