ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA JSON 라이브러리 Jackson 사용법
    JAVA 2013. 5. 22. 14:50
    반응형

    참조 :  

    1. http://jackson.codehaus.org/
    2. http://wiki.fasterxml.com/JacksonInFiveMinutes

    라이브러리 다운로드
    http://wiki.fasterxml.com/JacksonDownload
    jackson-core, jackson-databind, jackson-annotations 를 다운 받음.

    Jackson 에서 JSON 처리에 제공하는 방법
    1. Streaming API
         성능이 빠름.
    2. Tree Model
         일반적인 XML처럼 노드형태로 Json 데이터를 다룸. 유연성이 가장 좋음. 입맛대로 구성할 수 있음.
    3. Data Binding
         POJO 기반의 가자 객체들을 JSON으로 변환함.
       -Simple data Binding : 자바클래스 내의 Map, List, String, 숫자형, Boolean, null 형의 데이터들을 JSON으로 변환함.
       -Full data binding : Simple data Binding에서 제공하는것들을 포함하고 자바 빈타입에서 제공하는 데이터들도 JSON으로 변환함.


    소스
    * 공식사이트에 있는 import 패키지 이름이 버전업되면서 변경됐음.(2013-05-22)

    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    import com.fasterxml.jackson.core.JsonFactory;
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.databind.JsonMappingException;
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.node.ObjectNode;
    
    
    public class testJacksonJSON {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    
    		
    		try {
    
    			ObjectMapper mapper = new ObjectMapper(); // 재사용 가능하고 전체코드에서 공유함.
    
    
    			String user_json = "{\"name\" : { \"first\" : \"Joe\", \"last\" : \"Sixpack\" }, "
    					+ "	\"gender\" : \"MALE\", "
    					+ "	\"verified\" : false, "
    					+ "	\"userImage\" : \"Rm9vYmFyIQ==\" " + "		} ";
    
    			User user = mapper.readValue(user_json, User.class);
    			
    			System.out.println("First name : " + user.getName().getFirst());
    			System.out.println("Last name : " + user.getName().getLast());
    			System.out.println("Gender : " + user.getGender());
    			System.out.println("Verified : " + user.isVerified());
    
    			user.getName().setFirst("ChangeJoe");
    			user.getName().setLast("ChangeSixpack");
    			
    			String jsonStr = mapper.writeValueAsString(user);
    			System.out.println("Simple Binding : "+jsonStr);
    			
    			//직접 raw 데이터를 입력해서 JSON형태로 출력하는 방법.
    			Map userData = new HashMap();
    			Map nameStruct = new HashMap();
    			nameStruct.put("first", "RawJoe");
    			nameStruct.put("last", "Sixpack");
    			userData.put("name", nameStruct);
    			userData.put("gender", "MALE");
    			userData.put("verified", Boolean.FALSE);
    			userData.put("userImage", "Rm9vYmFyIQ==");
    			
    			jsonStr = mapper.writeValueAsString(userData);
    			System.out.println("Raw Data : "+jsonStr);
    			
    			//Tree 모델 예제
    			ObjectMapper m = new ObjectMapper();
    			// mapper.readTree(source), mapper.readValue(source, JsonNode.class); 둘중 하나 사용가능.
    			JsonNode rootNode = m.readTree(user_json);
    
    			JsonNode nameNode = rootNode.path("name");
    			String lastName = nameNode.path("last").textValue();
    			((ObjectNode)nameNode).put("last", "inputLast");
    			
    			jsonStr = m.writeValueAsString(rootNode);
    			System.out.println("Tree Model : "+jsonStr);
    			
    			
    			//Streaming API 예제
    			JsonFactory f = new JsonFactory();
    			
    			OutputStream outStr = System.out; 
    
    			JsonGenerator g = f.createJsonGenerator(outStr);
    
    			g.writeStartObject();
    			g.writeObjectFieldStart("name");
    			g.writeStringField("first", "StreamAPIFirst");
    			g.writeStringField("last", "Sixpack");
    			g.writeEndObject(); // 'name' 필드용.
    			g.writeStringField("gender", "MALE");
    			g.writeBooleanField("verified", false);
    			g.writeFieldName("userImage"); 
    			g.writeEndObject();
    			g.close(); // 사용한 다음 close해줘서 output에 있는 내용들을 flush해야함.
    			
    			
    		} catch (JsonParseException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (JsonMappingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    		e.printStackTrace();
    		}
    		
    		
    	}
    
    }
    
    class User {
        public enum Gender { MALE, FEMALE };
    
        public static class Name {
          private String _first, _last;
    
          public String getFirst() { return _first; }
          public String getLast() { return _last; }
    
          public void setFirst(String s) { _first = s; }
          public void setLast(String s) { _last = s; }
        }
    
        private Gender _gender;
        private Name _name;
        private boolean _isVerified;
        private byte[] _userImage;
    
        public Name getName() { return _name; }
        public boolean isVerified() { return _isVerified; }
        public Gender getGender() { return _gender; }
        public byte[] getUserImage() { return _userImage; }
    
        public void setName(Name n) { _name = n; }
        public void setVerified(boolean b) { _isVerified = b; }
        public void setGender(Gender g) { _gender = g; }
        public void setUserImage(byte[] b) { _userImage = b; }
    }
    

    반응형

    댓글

Designed by Tistory.