Java 용 json parser로 가장 많이 사용되는 것이 jackson이 아닐까 싶다. : REF
jackson2 가 spring 4에 포함되면서, RestController같은 경우 Object만 return 하면 자동으로
MappingJackson2HttpMessageConverter에 의해 json으로 변환된다. : REF
( 단, 모든 member변수에 getter와 setter가 있어야 한다 - 이게 귀찮으니.. Lombok이 쓸만하다)
(복잡한 List<Object> 사용시에는 는)
itemList = objectMapper.readValue(StringData, new TypeReference<List<MenuItemVo>>() {});
간단한 사용법은 다음과 같다.
클래서 선언이 다음과 같을 때,
class MyObject{
String name;
int age;
}
import com.fasterxml.jackson.databind.ObjectMapper;
<json -> java Object 방법>
ObjectMapper mapper = new ObjectMapper();
MyObject my = mapper.readValue ( file or URL or String , myObject.class);
<java Object -> json 방법>
MyObject my = new MyObject("name", 12 );
String jsonStr = mapper.writeValueAsString ( myObject )
결과는
{"name":"name", "age":12 } 로 되는데
좀 이쁘게 개행도 포함하고 싶으면
String jsonStr = mapper.writeWithDefaultPrettyPrinter().writeValueAsString ( myObject ); 으로 한다.
<변수명이 좀 다를때>
objectMapper.setPropertyNamingStrategy( PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
20년에 위에껀 deprecated되고. 아래와 같이 하면 snake_case 를 camelCase로 변환됨. 단 snake_case는 소문자임.
@Data
public static class Camel {
String userName;
}
@Test
// @Tag("excludeBuild") //테스트시 comment 필요.
public void mapperTest() throws Exception{
ObjectMapper mapper1 = new ObjectMapper().setPropertyNamingStrategy(
PropertyNamingStrategy.SNAKE_CASE);
Camel camel1 = mapper1.readValue ("{\"user_name\":\"Kim\"}", Camel.class );
log.info("Camel1:" + camel1);
개선: 아래로 하면 대문자도 되는 듯
+ mapperDome.setPropertyNamingStrategy(new PropertyNamingStrategies.SnakeCaseStrategy());
spring등에선 @JsonProperty로 변환용 변수명을 설정할 수 있지만,여러개일 경우 PropertyNameStrategy 설정이 매우 유용하다.
<null은 제외>
@JsonInclude(JsonInclude.Include.NON_NULL)
<LocalDateTime 변환>
@JsonSerialize(using = LocalDateTimeJsonSerializer.class) : Custom Serializer 이용.
public class LocalDateTimeJsonSerializer extends JsonSerializer<LocalDateTime> {
private static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS =
DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
@Override
public void serialize(LocalDateTime localDateTime,
JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(localDateTime.format(YYYY_MM_DD_HH_MM_SS));
}
}
<Object Copy>
import org.apache.phoenix.shaded.org.apache.commons.beanutils.BeanUtils;
try {
//멤버type과 이름이 딱맞는 애들만 쭉 copy해준다.
BeanUtils.copyProperties(destObj, srcObj);
} catch (Exception e) {
e.printStackTrace();
}