요구사항
결과값을 json 형태로 반환하기
관련 라이브러리
- ezmorph-1.0.6.jar
- json-lib-2.3-jdk15.jar
- commons-lang.jar
- commons-logging-1.1.jar
- commons-collections-3.2.jar
- commons-beanutils-1.8.0.jar
- commons-beanutils-bean-collections-1.8.0.jar
- commons-beanutils-core-1.8.0.jar
테스트에 앞서 dto 생성
package test.dto;
import java.math.BigDecimal;
import java.util.Date;
public class A {
private String id;
private int age;
private Date credate;
private BigDecimal iq;
public A(String id, int age, Date credate, BigDecimal iq){
this.id=id;
this.age=age;
this.credate=credate;
this.iq=iq;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getCredate() {
return credate;
}
public void setCredate(Date credate) {
this.credate = credate;
}
public BigDecimal getIq() {
return iq;
}
public void setIq(BigDecimal iq) {
this.iq = iq;
}
}
실재 처리 할 util 클래스
public class JsonUtil {
public static String getJsonString(Object obj){
if(obj == null) return null;
return JSONObject.fromObject(obj).toString();
}
}
테스트 클래스
public class JsonTest {
public static void main(String[] args) {
// object test
System.out.println(JsonUtil.getJsonString(getTestData()));
// result : {"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":46,"month":6,"seconds":19,"time":1280123179718,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010}
}
private static Object getTestData(){
A a = new A("kkaok", 20, new Date(), new BigDecimal(2010));
return a;
}
}
1. 기본 객체 테스트
result :
{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":46,"month":6,"seconds":19,"time":1280123179718,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010}
2. java.util.Date type인 경우 conversion하기
기본적인 테스트는 성공했는데 결과 값 중에 날짜가 영 맘에 안든다.
날짜를 바꿔보기 ("yyyy-MM-dd HH:mm:ss.SSS")
JsonValueProcessor로 java.util.Date 타입인 경우 "yyyy-MM-dd HH:mm:ss.SSS" 형태로 결과를 보여 주도록 한다.
package test.support;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
public class JavaUtilDateJsonValueProcessor implements JsonValueProcessor {
private final DateFormat defaultDateFormat;
public JavaUtilDateJsonValueProcessor(){
defaultDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.KOREA);
}
@Override
public Object processArrayValue(Object paramObject,
JsonConfig paramJsonConfig) {
if(paramObject == null) return null;
return defaultDateFormat.format(paramObject);
}
@Override
public Object processObjectValue(String paramString, Object paramObject,
JsonConfig paramJsonConfig) {
return processArrayValue(paramObject, paramJsonConfig);
}
}
util에 JsonConfig에 추가해 준다.
public class JsonUtil {
public static String getJsonString(Object obj){
if(obj == null) return null;
JsonValueProcessor beanProcessor = new JavaUtilDateJsonValueProcessor();
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(java.util.Date.class, beanProcessor);
return JSONObject.fromObject(obj, jsonConfig).toString();
}
}
테스트 결과
{"age":20,"credate":"2010-07-26 14:46:20.406","id":"kkaok","iq":2010}
괜찮게 나온다.
3. 값이 null일때는 어떻게 나올까?
public static void main(String[] args) {
// object test
System.out.println(JsonUtil.getJsonString(getTestData()));
// result : {"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":46,"month":6,"seconds":19,"time":1280123179718,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010}
// 날짜 꼬라지 하고는 바꾸자
System.out.println(JsonUtil.getJsonString2(getTestData()));
// result : {"age":20,"credate":"2010-01-25 17:30:19.165","id":"kkaok","iq":2010}
// null로 대충 채우고 확인
System.out.println(JsonUtil.getJsonString2(getTestData2()));
// result : {"age":20,"credate":null,"id":"","iq":0}
}
private static Object getTestData2(){
A a = new A(null, 20, null, null);
return a;
}
결과 :
{"age":20,"credate":null,"id":"","iq":0}
없으면 없는대로 나온다.
4. 객체 안에 객체를 필드로 가지고 있는 경우는 어떨까?
dto 추가
package test.dto;
public class B {
public B(A a, String bid) {
super();
this.a = a;
this.bid = bid;
}
private A a;
private String bid;
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
public String getBid() {
return bid;
}
public void setBid(String bid) {
this.bid = bid;
}
}
테스트
public static void main(String[] args) {
// 객체를 필드로 가지고 있는 객체 테스트1
System.out.println(JsonUtil.getJsonString2(getTestData3()));
// result : {"a":{"age":20,"credate":"2010-07-26 14:57:04.468","id":"kkaok","iq":2010},"bid":"aaaa"}
}
private static Object getTestData3(){
A a = new A("kkaok", 20, new Date(), new BigDecimal(2010));
B b = new B(a, "aaaa");
return b;
}
5. Map인 경우는?
public static void main(String[] args) {
// map test
System.out.println(JsonUtil.getJsonString2(getTestData5()));
// result : {"credate":"2010-07-26 14:57:04.468","test":{"a":{"age":20,"credate":"2010-07-26 14:57:04.468","id":"kkaok","iq":2010},"bid":"aaaa"},"name":"kkaok"}
}
private static Object getTestData5(){
Map map = new HashMap();
map.put("test", getTestData3());
map.put("name", "kkaok");
map.put("credate", new Date());
return map;
}
6. list 테스트.
util에 JSONArray 추가
public class JsonUtil {
public static String getJsonString(Object obj){
if(obj == null) return null;
return JSONObject.fromObject(obj).toString();
}
public static String getJsonString2(Object obj){
if(obj == null) return null;
JsonValueProcessor beanProcessor = new JavaUtilDateJsonValueProcessor();
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(java.util.Date.class, beanProcessor);
return JSONObject.fromObject(obj, jsonConfig).toString();
}
public static String getJSONArrayString(Object objList){
if(objList == null) return null;
JSONArray jsonArray = JSONArray.fromObject(objList);
return jsonArray.toString();
}
}
테스트
public static void main(String[] args) {
// list test
System.out.println("6. "+JsonUtil.getJSONArrayString(getTestData6()));
// result : [{"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"test":{"a":{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010},"bid":"aaaa"},"name":"kkaok"},{"a":{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010},"bid":"aaaa"}]
}
private static Object getTestData6(){
List list = new ArrayList();
list.add(getTestData5());
list.add(getTestData3());
return list;
}
List안에 객체랑 Map이랑 마구 섞어 놓아도 잘 된다.
7. Map안에 List는 잘 처리 될까?
public static void main(String[] args) {
// map 안에 list test
System.out.println("7. "+JsonUtil.getJsonString2(getTestData7()));
// result : {"credate":"2010-07-26 14:57:04.468","test":[{"credate":"2010-07-26 14:57:04.468","test":{"a":{"age":20,"credate":"2010-07-26 14:57:04.468","id":"kkaok","iq":2010},"bid":"aaaa"},"name":"kkaok"},{"a":{"age":20,"credate":"2010-07-26 14:57:04.468","id":"kkaok","iq":2010},"bid":"aaaa"}],"name":"kkaok"}
}
private static Object getTestData7(){
Map map = new HashMap();
map.put("test", getTestData6());
map.put("name", "kkaok");
map.put("credate", new Date());
return map;
}
잘 된다. ^^
8. List안에 List 담기
public static void main(String[] args) {
// list 안에 list test
System.out.println("8. "+JsonUtil.getJSONArrayString(getTestData8()));
// result : [[{"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"test":{"a":{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010},"bid":"aaaa"},"name":"kkaok"},{"a":{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010},"bid":"aaaa"}],{"a":{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010},"bid":"aaaa"}]
}
private static Object getTestData8(){
List list = new ArrayList();
list.add(getTestData6());
list.add(getTestData3());
return list;
}
파싱할때 객체가 isArray 면 JSONArray를 이용하고 그외 나머지는 JSONObject를 이용하면 쉽게 변환이 된다.
그외 conversion이 필요한 경우 JsonConfig에 등록해서 처리하면 된다.
값을 처리하는 인터페이스는 JsonValueProcessor 이용하고 Bean을 처리하는 인터페이스는 JsonBeanProcessor 이용하면 된다.
그외 인터페이스 참고
댓글을 달아 주세요
시작하기 위해 내 배우자를 언급하고 새로운 설문 조사가 부가 확인란되고이 후 의견을 포함시킬 수 때 같은 검토를 고집 일부 메시지를 구입하는 동안 당신 - 알림을해서 교전이 동안. 아마 그러나 당신이 도움이됩니다 통해 멀리 데려다해야 있나요? 건배!
2012.01.29 14:32 [ ADDR : EDIT/ DEL : REPLY ]비밀댓글입니다
2012.04.10 04:07 [ ADDR : EDIT/ DEL : REPLY ]시작하기 위해 내 배우자를 언급하고 새로운 설문 조사가 부가 확인란되고이 후 의견을 포함시킬 수 때 같은 검토를 고집 일부 메시지를 구입하는 동안 당신 - 알림을해서 교전이 동안.
2012.11.23 11:59 [ ADDR : EDIT/ DEL : REPLY ]<a href='http://blogtegal.com' title='blog tutorial'>blog tutorial</a> <a href='http://blogtegal.com/2011/10/cara-membeli-hosting-hostgator.html'>membeli hosting hostgator</a> <a href='http://blogtegal.com/category/hosting'>hosting</a>
2013.02.06 23:41 [ ADDR : EDIT/ DEL : REPLY ]to very-very impressiv, ny0ng miki nemu nd0g lenggarangan sg kaya koen admin hehe
2013.02.06 23:46 [ ADDR : EDIT/ DEL : REPLY ]http://googlemin.blogspot.com
http://googlemin.blogspot.com/2013/01/bank-mandiri-bank-terbaik-di-indonesia.html