[JSON] Jackson

:)·2024년 4월 11일

개발

목록 보기
19/19
post-thumbnail

JSON

JSON(JavaScript Object Notation) : Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷

유형 및 예시

https://www.oracle.com/kr/database/what-is-json/

  1. 배열
  2. Boolean
  3. Null
  4. 숫자
  5. 객체
  6. 문자열
  • 예시
{

"Influencers" :   [ 
{
 "name" : "Jaxon", 
 "age" : 42, 
 "Works At" : "Tech News"
}

{
 "name" : "Miller", 
 "age" : 35
 "Works At" : "IT Day"
}

] 
}

Jackson

  • Jackson: JSON 데이터 구조를 처리해주는 라이브러리
    • 사용시 DTO에 필요한 코드 - 기본 생성자, GET…
    • { ; } : JSON
      @ToString
      @EqualsAndHashCode
      @AllArgsConstructor
      @NoArgsConstructor	//jackson 라이브러리 매핑에 필요(json 을 자바객체로 변경할떄)
      @Getter
    • pom.xml, graddle
      • pom.xml
        <properties> 
        	<jackson.version>2.11.2</jackson.version> 
        </properties>
         
        <dependencies>		
        		<dependency>
        			<groupId>com.fasterxml.jackson.core</groupId>
        			<artifactId>jackson-databind</artifactId>
        			<version>${jackson.version}</version>
        		</dependency>
        </dependencies>
    • 메소드 JSON.stringify : 객체(또는 배열) → JSON 형식 문자열로 변환(직렬화)
      JSON.parse: 반대 (역직렬화)
      객체 : const obj ={ id: 1, name: 'sana', age: 25, hobby: ['movie','yoga'] };
      JSON 문자열 : " { "id": 1, "name": "sana", "age": 25, "hobby": ["movie","yoga"] }"
      • 자바 → json 전달
        • (고객 전체 조회한것(List) 자바 객체를 json 문자열로 변환해서 응답으로 보내주기->jackson-bind 라이브러리로 매우 쉽게 할 수 있음)

          public class ApiCustomerListController implements Controller {
          	public static final Logger logger = LoggerFactory.getLogger(ApiCustomerListController.class);
          	
          	@Override
          	public void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          		MybatisCustomer dao = new MybatisCustomer();
          		List<CustomerDto> list = dao.selectAll();
          		
          		//자바객체를 json 문자열로 변환
          		ObjectMapper objectMapper = new ObjectMapper();
          		String jsonData = null;
          		objectMapper.writeValueAsString(list);
          		logger.info("전송할 json문자열: {}", jsonData);		
          	}
      • json 을 이용한 insert 메소드 사용
        ```java
        package day7.api;
        
        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        import java.nio.charset.StandardCharsets;
        
        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        
        import com.fasterxml.jackson.databind.ObjectMapper;
        
        import day4.mybatis.dao.MybatisCustomer;
        import day4.mybatis.dto.CustomerDto;
        import lombok.extern.slf4j.Slf4j;
        @Slf4j
        public class ApiCustomerPostController implements Controller {
        
        	@Override
        	public void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        		
        		request.setCharacterEncoding("UTF-8");
        		//사용자가 보낸 데이터는 json 문자열입니다. 이 데이터를 읽어오기 위해 입력스트림이 필요
        		InputStream inputStream = request.getInputStream(); //http 전송방식의 입력스트림 생성, 요청 객체로 만들어짐
        		//입출력의 속도 향상을 위해 버퍼 사용
        		BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
        		
        		StringBuffer sb = new StringBuffer(); //String 은 불변객체이므로 +연결을 대신하는 메소드를 사용하기 위해 필요
        		String line =null;
        		
        		while((line = br.readLine()) != null) { //입력스트림으로부터 1줄씩 읽어옴
        			sb.append(line);
        			log.info("line: {}", line);
        		}
        		//json 문자열을 자바 객체로 변환
        		ObjectMapper objectMapper = new ObjectMapper();
        		CustomerDto dto = objectMapper.readValue(sb.toString(),CustomerDto.class);
        		
        		log.info("변환된 dto: {}",dto);
        		
        		//dao에서 insert
        		int result=0;
        		try {
        			MybatisCustomer dao = new MybatisCustomer(); 
        			result = dao.insert(dto);
        		} catch (Exception e) {
        			e.printStackTrace();
        			log.info("dao insert 예외: {}",e.getMessage());
        		}
        		 
        		 //insert 결과에 대한 응답을 보내기
        		//방법2: json 문자열로 result 값 보내기 -> 직접 문자열을 만드는 대신 Map에 저장해서 변환할 수도 있음
        		String jsonData = "{\"result\" : "+result+"}";
        		response.setContentType("application/json;charset=UTF-8");
        		response.getWriter().print(jsonData);
        			
        		 //방법1
        		 //String message = "회원등록이 완료되었습니다.";
        		 //if(result ==0) message = "회원등록 오류입니다. ID 중복 확인하세요.";
        		
        		//response.setContentType("text/plain;charset=UTF-8");
        		//response.getWriter().print(message);	 }}
        ```
  • json 을 이용한 select메소드 사용
       public class ApiCustomerGetController implements Controller {
       public static final Logger logger = LoggerFactory.getLogger(ApiCustomerListController.class);
       	
       	@Override
       	public void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       		MybatisCustomer dao = new MybatisCustomer();
       		CustomerDto dto = dao.getCustomer(request.getParameter("id"));
       
       		//자바객체를 json 문자열로 변환
       		//1) 아이디 중복검사가 아닌, 고객 정보 조회용
       		ObjectMapper objectMapper = new ObjectMapper(); String jsonData = null;
       		jsonData = objectMapper.writeValueAsString(dto);
       		logger.info("전송할 json문자열: {}", jsonData);
       		 
       		//2)아이디 중복검사인 경우에는 json으로 있다 없다에 대한 값으로 전달하기
       		int result = 0;
       		if(dto!=null)result=1;
       		String jsonData2 = "{\"result\" : "+result+"}";
       		response.setContentType("application/json;charset=UTF-8");
       		response.getWriter().print(jsonData2);	}		}
     
profile
:) GITHUB: https://github.com/YJ2123412

0개의 댓글