참고 : http://json-lib.sourceforge.net/
         http://json-lib.sourceforge.net/snippets.html

출처 : http://redtrain.tistory.com/819


* json-lib library 추가 (Maven)

<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>xom</groupId>
<artifactId>xom</artifactId>
<version>1.2.5</version>
</dependency> 


Introduction


JSON-lib (http://json-lib.sourceforge.net/)는 자바에서 beans, maps, collections, array 그리고 XML을 JSON 으로 변환하기 위해 사용하는 자바 라이브러리이다. 




Download


다음의 경로에서 다운로드 한다.



Dependencies


주의해야할 점은 common-lang 최신 버전(3.3.1)을 사용할 경우 org.apache.commons.lang.exception.NestableRuntimeException 이 발생하게 된다. 위의 경로에서 패키지를 다운 받아 등록하거나 pom.xml에 아래의 Dependency를 추가한다.
  1. <dependency>  
  2.     <groupId>commons-lang</groupId>  
  3.     <artifactId>commons-lang</artifactId>  
  4.     <version>2.6</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>commons-beanutils</groupId>  
  8.     <artifactId>commons-beanutils</artifactId>  
  9.     <version>1.8.3</version>  
  10. </dependency>  
  11. <dependency>  
  12.     <groupId>commons-collections</groupId>  
  13.     <artifactId>commons-collections</artifactId>  
  14.     <version>3.2.1</version>  
  15. </dependency>  
  16. <dependency>  
  17.     <groupId>commons-logging</groupId>  
  18.     <artifactId>commons-logging</artifactId>  
  19.     <version>1.1.1</version>  
  20. </dependency>  
  21. <dependency>  
  22.     <groupId>net.sf.ezmorph</groupId>  
  23.     <artifactId>ezmorph</artifactId>  
  24.     <version>1.0.6</version>  
  25. </dependency>  



How to use json-lib


Array and Collection to JSON : 

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. import junit.framework.TestCase;  
  4. import net.sf.json.JSONArray;  
  5.   
  6. public class JSONLibTest extends TestCase {  
  7.   
  8.     public void testArrayCollection() {  
  9.         boolean[] boolArray = new boolean[]{true,false};    
  10.         JSONArray jsonArray = JSONArray.fromObject( boolArray );    
  11.         System.out.println( "boolArray : " + jsonArray );  
  12.           
  13.         List<String> list = new ArrayList<String>();    
  14.         list.add("1");  
  15.         list.add("second");  
  16.         list.add("셋");  
  17.           
  18.         JSONArray jsonArray1 = JSONArray.fromObject( list );    
  19.         System.out.println( "jsonArray1:" + jsonArray1 );  
  20.           
  21.         JSONArray jsonArray2 = JSONArray.fromObject( "['하나','2','third']" );    
  22.         System.out.println( "jsonArray2:" + jsonArray2 );  
  23.     }  
  24. }  
  25.   
  26. //boolArray : [true,false]  
  27. //jsonArray1:["1","second","셋"]  
  28. //jsonArray2:["하나","2","third"]  


Bean and Map to JSON : 

  1. //Sample Bean  
  2. import net.sf.json.JSONFunction;  
  3.   
  4. public class TestBean {  
  5.     private String name = "json";  
  6.     private int num = 1;  
  7.     private char[] options = new char[]{ 'k''o''r' };  
  8.     private String func1 = "function(i) { return this.options[i]; }";  
  9.     private JSONFunction func2 = new JSONFunction(new String[]{"i"},"return this.options[i];");  
  10.       
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.     public void setName(String name) {  
  15.         this.name = name;  
  16.     }  
  17.     public int getNum() {  
  18.         return num;  
  19.     }  
  20.     public void setNum(int num) {  
  21.         this.num = num;  
  22.     }  
  23.     public char[] getOptions() {  
  24.         return options;  
  25.     }  
  26.     public void setOptions(char[] options) {  
  27.         this.options = options;  
  28.     }  
  29.     public String getFunc1() {  
  30.         return func1;  
  31.     }  
  32.     public void setFunc1(String func1) {  
  33.         this.func1 = func1;  
  34.     }  
  35.     public JSONFunction getFunc2() {  
  36.         return func2;  
  37.     }  
  38.     public void setFunc2(JSONFunction func2) {  
  39.         this.func2 = func2;  
  40.     }  
  41. }  
  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3.   
  4. import junit.framework.TestCase;  
  5. import net.sf.json.JSONObject;  
  6.   
  7. public class JSONLibTest extends TestCase {  
  8.     public void testBeanMaps() {  
  9.         Map<String, Object> map = new HashMap<String, Object>();    
  10.         map.put( "string""jin" );    
  11.         map.put( "bool", Boolean.TRUE );    
  12.         map.put( "int"new Integer(1) );    
  13.         map.put( "array"new String[]{"a","b"} );    
  14.         map.put( "function""function(i){ return this.arr[i]; }" );    
  15.           
  16.         JSONObject jsonObjectMap = JSONObject.fromObject( map );    
  17.         System.out.println( "jsonObjectMap:" +  jsonObjectMap );  
  18.           
  19.         JSONObject jsonObjectBean = JSONObject.fromObject( new TestBean() );    
  20.         System.out.println( "jsonObjectBean:" +  jsonObjectBean );  
  21.     }  
  22. }  
  23.   
  24. //jsonObjectMap:{"int":1,"string":"jin","bool":true,"function":function(i){ return this.arr[i]; },"array":["a","b"]}  
  25.   
  26. //jsonObjectBean:{"func1":function(i) { return this.options[i]; },"func2":function(i){ return this.options[i]; },"name":"json","num":1,"options":["k","o","r"]}  


JSON to Beans : 

  1. import java.lang.reflect.InvocationTargetException;  
  2. import java.util.List;  
  3.   
  4. import junit.framework.TestCase;  
  5. import net.sf.json.JSONArray;  
  6. import net.sf.json.JSONObject;  
  7.   
  8. import org.apache.commons.beanutils.PropertyUtils;  
  9.   
  10. public class JSONLibTest extends TestCase {  
  11.     @SuppressWarnings("unchecked")  
  12.     public void testJsonToBeans() throws   
  13.             IllegalAccessException, InvocationTargetException, NoSuchMethodException {  
  14.   
  15.         String strJson = "{\"func1\":function(i) { return this.options[i]; },\"func2\":function(i){ return this.options[i]; },\"name\":\"json\",\"num\":1,\"options\":[\"k\",\"o\",\"r\"]}";  
  16.           
  17.         JSONObject jsonObjectJsonToBeans = JSONObject.fromObject( strJson );  
  18.         Object beans = JSONObject.toBean( jsonObjectJsonToBeans );   
  19.           
  20.         assertEquals( jsonObjectJsonToBeans.get( "name" ),   
  21.                         PropertyUtils.getProperty( beans, "name" ) );   
  22.         assertEquals( jsonObjectJsonToBeans.get( "num" ),   
  23.                         PropertyUtils.getProperty( beans, "num" ) );   
  24.         assertEquals( jsonObjectJsonToBeans.get( "func1" ),   
  25.                         PropertyUtils.getProperty( beans, "func1" ) );   
  26.         assertEquals( jsonObjectJsonToBeans.get( "func2" ),   
  27.                         PropertyUtils.getProperty( beans, "func2" ) );   
  28.   
  29.         @SuppressWarnings("deprecation")  
  30.         List<String> expected = JSONArray.toList(jsonObjectJsonToBeans.getJSONArray("options"));  
  31.         assertEquals( expected, (List<String>) PropertyUtils.getProperty(beans, "options") );  
  32.     }     
  33. }  


Json to XML AND XML to JSON : 

XMLSerializer.write()와 XMLSerializer.read() 를 사용하여 XML을 JSON으로 JSON을 XML로 변환할 수 있다.

  1. import junit.framework.TestCase;  
  2. import net.sf.json.JSONArray;  
  3. import net.sf.json.JSONObject;  
  4. import net.sf.json.xml.XMLSerializer;  
  5.   
  6. public class JSONLibTest extends TestCase {  
  7.     public void testXML() {  
  8.         XMLSerializer xmlSerializer = new XMLSerializer();  
  9.   
  10.         String strXml1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><book>" +   
  11.                         "<title>XML To JSON</title><author>json-lib</author></book>";  
  12.   
  13.         JSONObject jsonObject1 = (JSONObject) xmlSerializer.read(strXml1);    
  14.         System.out.println( jsonObject1 );  
  15.           
  16.         JSONObject jsonObject2 = new JSONObject( true );  
  17.         String strXml2 = xmlSerializer.write( jsonObject2 );  
  18.         System.out.println( strXml2 );  
  19.   
  20.         JSONArray jsonObject3 = JSONArray.fromObject("[1,2,3]");    
  21.         String strXml3 = xmlSerializer.write( jsonObject3 );  
  22.         System.out.println( strXml3 );  
  23.           
  24.         System.out.println( "jsonObject1(json to xml):"+ xmlSerializer.read(strXml1) );  
  25.   
  26.         System.out.println( "jsonObject2(json to xml):"+ xmlSerializer.read(strXml2) );  
  27.           
  28.         System.out.println( "jsonObject3(json to xml):"+ xmlSerializer.read(strXml3) );  
  29.     }     
  30. }  
  31.   
  32. //jsonObject1(xml to json):{"title":"XML To JSON","author":"json-lib"}  
  33. //jsonObject2(xml to json):<?xml version="1.0" encoding="UTF-8"?>  
  34. //<o null="true"/>  
  35.   
  36. //jsonObject3(xml to json):<?xml version="1.0" encoding="UTF-8"?>  
  37. //<a><e type="number">1</e><e type="number">2</e><e type="number">3</e></a>  
  38.   
  39. //jsonObject1(json to xml):{"title":"XML To JSON","author":"json-lib"}  
  40. //jsonObject2(json to xml):null  
  41. //jsonObject3(json to xml):["1","2","3"]  


그런데 위의 소스를 돌려보면 java.lang.NoClassDefFoundError: nu/xom/Element 를 던진다.

json-lib 사이트에서 살펴보면 이와 관련된 언급이 없는 것 같은데...


라이브러리를 하나 추가해야 한다.

XOM(XML Object Model) 라이브러리를 추가해야한다. 여기서 다운로드 할 수 있다.




위의 코드를 돌려보면서 발생할 수 있는 Exception은 다음과 같다.

  • java.lang.NoClassDefFoundError
    • 위의 의존성 패키지에서 누락된게 있는지 확인해본다.
  • org.apache.commons.lang.exception.NestableRuntimeException
    • 최신버전 (commons-lang3-3.1.jar) 사용시에 오류 발생
  • java.lang.NoClassDefFoundError: nu/xom/Element
    • XML을 사용할 때 라이브러리를 추가한다.


+ Recent posts