com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "필드명"

 

에러 원인은 json 문자열에 있는 키값이 DTO등 객체에는 없어서 생기는 문제

 

해결법은 

DTO등 객체 클래스 위에

@JsonIgnoreProperties(ignoreUnknown = true)

어노테이션 설정

 

또는

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

ObjectMapper 설정에 없는 필드 무시 설정

 

 

스트링 형식을 DTO로 매핑하기

그리고 DTO를 json스트링으로 변환하기

 

UserDTO.class

public class UserDTO {

	String userID;
	String userName;
	public String getUserID() {
		return userID;
	}
	public void setUserID(String userID) {
		this.userID = userID;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}

}

 

변환소스

package test2.mapper;

import java.util.Arrays;
import java.util.List;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import com.fasterxml.jackson.databind.ObjectMapper;

import test2.entity.dto.UserDTO;

@SpringBootTest
public class StringToDto {
	
	@Test
	public void stringToJsonToDto() {
		String str = "{\"userID\":\"user01\", \"userName\":\"홍길동\"}";
		String strList = "[{\"userID\":\"user01\", \"userName\":\"홍길동\"},{\"userID\":\"user02\", \"userName\":\"홍길순\"}]";
		
		ObjectMapper mapper = new ObjectMapper();
		try {
			// 1. 스트링에서 DTO로 매핑하기
			UserDTO dto = mapper.readValue(str, UserDTO.class);
			System.out.println(dto);
			// UserDTO(userID=user01, userName=홍길동)
			
			// 2. 스트링에서 DTO LIST로 매핑하기
			List<UserDTO> dtos = Arrays.asList(mapper.readValue(strList, UserDTO[].class));
			System.out.println(dtos.size() + " : " +dtos);
			// 2 : [UserDTO(userID=user01, userName=홍길동), UserDTO(userID=user02, userName=홍길순)]
			
			// 객체를 JSON 스트링으로 변환하기
			String jsonStr = mapper.writeValueAsString(dtos);
			System.out.println(jsonStr);
			// [{"userID":"user01","userName":"홍길동"},{"userID":"user02","userName":"홍길순"}]
			
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
	
}

 

 

메이븐에 spring-boot-starter-web을 포함하거나

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

또는 jackson을 포함한다.

		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-databind</artifactId>
		    <version>2.9.8</version>
		</dependency>

+ Recent posts