|
|
|
@ -1,9 +1,15 @@
|
|
|
|
|
package cokr.xit.foundation.data;
|
|
|
|
|
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
|
|
|
|
import com.fasterxml.jackson.core.JsonParser.Feature;
|
|
|
|
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
|
import com.fasterxml.jackson.databind.ObjectWriter;
|
|
|
|
|
import com.fasterxml.jackson.databind.ser.FilterProvider;
|
|
|
|
|
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
|
|
|
|
|
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
|
|
|
|
|
|
|
|
|
|
import cokr.xit.foundation.AbstractComponent;
|
|
|
|
|
|
|
|
|
@ -12,6 +18,7 @@ import cokr.xit.foundation.AbstractComponent;
|
|
|
|
|
*/
|
|
|
|
|
public class JSON extends AbstractComponent {
|
|
|
|
|
private ObjectMapper objectMapper;
|
|
|
|
|
private FilterProvider filterProvider;
|
|
|
|
|
|
|
|
|
|
/**JSON 포맷/파싱에 사용하는 ObjectMapper를 반환한다.
|
|
|
|
|
* @return JSON 포맷/파싱에 사용하는 ObjectMapper
|
|
|
|
@ -20,6 +27,7 @@ public class JSON extends AbstractComponent {
|
|
|
|
|
if (objectMapper == null) {
|
|
|
|
|
objectMapper = new ObjectMapper();
|
|
|
|
|
objectMapper.configure(Feature.ALLOW_COMMENTS, true);
|
|
|
|
|
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
|
|
|
|
}
|
|
|
|
|
return objectMapper;
|
|
|
|
|
}
|
|
|
|
@ -33,6 +41,15 @@ public class JSON extends AbstractComponent {
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**객체를 JSON 문자열로 변환할 때 적용할 Filter를 반환한다.<br />
|
|
|
|
|
* 이 때 객체의 클래스는 {@code @JsonFilter("필터 아이디")} 주석이 적용되어 있어야 한다.
|
|
|
|
|
* @param id 필터 아이디
|
|
|
|
|
* @return Filter
|
|
|
|
|
*/
|
|
|
|
|
public Filter filter(String id) {
|
|
|
|
|
return new Filter().init(id, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**JSON 문자열을 파싱하여 주어진 클래스의 객체로 변환한다.
|
|
|
|
|
* @param <T> 클래스 유형
|
|
|
|
|
* @param json JSON 문자열
|
|
|
|
@ -80,10 +97,81 @@ public class JSON extends AbstractComponent {
|
|
|
|
|
public String stringify(Object obj, boolean indent) {
|
|
|
|
|
if (obj instanceof String)
|
|
|
|
|
return (String)obj;
|
|
|
|
|
|
|
|
|
|
ObjectMapper mapper = getObjectMapper();
|
|
|
|
|
ObjectWriter writer = null;
|
|
|
|
|
if (!indent) {
|
|
|
|
|
writer = filterProvider == null ? mapper.writer() : mapper.writer(filterProvider);
|
|
|
|
|
} else {
|
|
|
|
|
writer = mapper.writerWithDefaultPrettyPrinter();
|
|
|
|
|
if (filterProvider != null)
|
|
|
|
|
writer = writer.with(filterProvider);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
return getObjectMapper().writeValueAsString(obj);
|
|
|
|
|
return writer.writeValueAsString(obj);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
throw runtimeException(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**객체를 JSON 문자열로 변환할 때 적용할 필터 설정을 지원하는 클래스.<br />
|
|
|
|
|
* 이 때 객체의 클래스는 {@code @JsonFilter("필터 아이디")} 주석이 적용되어 있어야 한다.
|
|
|
|
|
* @author mjkhan
|
|
|
|
|
*/
|
|
|
|
|
public static class Filter {
|
|
|
|
|
private String id;
|
|
|
|
|
private JSON json;
|
|
|
|
|
|
|
|
|
|
private Filter init(String id, JSON json) {
|
|
|
|
|
this.id = id;
|
|
|
|
|
this.json = json;
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**JSON 문자열로 변환할 때 포함시킬 객체의 프로퍼티 이름을 설정한다.<br />
|
|
|
|
|
* 빈 값을 설정하면 모든 프로퍼티를 포함시킨다.
|
|
|
|
|
* @param properties JSON 문자열에 포함시킬 객체의 프로퍼티 이름
|
|
|
|
|
* @return JSON
|
|
|
|
|
*/
|
|
|
|
|
public JSON include(Set<String> properties) {
|
|
|
|
|
return setProvider(!isEmpty(properties) ?
|
|
|
|
|
SimpleBeanPropertyFilter.filterOutAllExcept(properties) :
|
|
|
|
|
SimpleBeanPropertyFilter.serializeAll()
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**JSON 문자열로 변환할 때 포함시킬 객체의 프로퍼티 이름을 설정한다.<br />
|
|
|
|
|
* 빈 값을 설정하면 모든 프로퍼티를 포함시킨다.
|
|
|
|
|
* @param properties JSON 문자열에 포함시킬 객체의 프로퍼티 이름
|
|
|
|
|
* @return JSON
|
|
|
|
|
*/
|
|
|
|
|
public JSON include(String... properties) {
|
|
|
|
|
return include(Set.of(properties));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**JSON 문자열로 변환할 때 제외할 객체의 프로퍼티 이름을 설정한다.
|
|
|
|
|
* @param properties JSON 문자열에서 제외할 객체의 프로퍼티 이름
|
|
|
|
|
* @return JSON
|
|
|
|
|
*/
|
|
|
|
|
public JSON exclude(Set<String> properties) {
|
|
|
|
|
notEmpty(properties, "properties");
|
|
|
|
|
return setProvider(SimpleBeanPropertyFilter.serializeAllExcept(properties));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**JSON 문자열로 변환할 때 제외할 객체의 프로퍼티 이름을 설정한다.
|
|
|
|
|
* @param properties JSON 문자열에서 제외할 객체의 프로퍼티 이름
|
|
|
|
|
* @return JSON
|
|
|
|
|
*/
|
|
|
|
|
public JSON exclude(String... properties) {
|
|
|
|
|
return exclude(Set.of(properties));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private JSON setProvider(SimpleBeanPropertyFilter filter) {
|
|
|
|
|
SimpleFilterProvider provider = new SimpleFilterProvider();
|
|
|
|
|
provider.addFilter(id, filter);
|
|
|
|
|
json.filterProvider = provider;
|
|
|
|
|
return json;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|