참고 : http://json-lib.sourceforge.net/
http://json-lib.sourceforge.net/snippets.html
출처 : http://redtrain.tistory.com/819
* json-lib library 추가 (Maven)
<dependency> |
Introduction |
JSON-lib (http://json-lib.sourceforge.net/)는 자바에서 beans, maps, collections, array 그리고 XML을 JSON 으로 변환하기 위해 사용하는 자바 라이브러리이다.
- Javadoc
JSON-lib는 아래의 패키지에 의존성을 가지고 있다.
- <dependency>
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- <version>2.6</version>
- </dependency>
- <dependency>
- <groupId>commons-beanutils</groupId>
- <artifactId>commons-beanutils</artifactId>
- <version>1.8.3</version>
- </dependency>
- <dependency>
- <groupId>commons-collections</groupId>
- <artifactId>commons-collections</artifactId>
- <version>3.2.1</version>
- </dependency>
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1.1</version>
- </dependency>
- <dependency>
- <groupId>net.sf.ezmorph</groupId>
- <artifactId>ezmorph</artifactId>
- <version>1.0.6</version>
- </dependency>
How to use json-lib
Array and Collection to JSON :
- import java.util.ArrayList;
- import java.util.List;
- import junit.framework.TestCase;
- import net.sf.json.JSONArray;
- public class JSONLibTest extends TestCase {
- public void testArrayCollection() {
- boolean[] boolArray = new boolean[]{true,false};
- JSONArray jsonArray = JSONArray.fromObject( boolArray );
- System.out.println( "boolArray : " + jsonArray );
- List<String> list = new ArrayList<String>();
- list.add("1");
- list.add("second");
- list.add("셋");
- JSONArray jsonArray1 = JSONArray.fromObject( list );
- System.out.println( "jsonArray1:" + jsonArray1 );
- JSONArray jsonArray2 = JSONArray.fromObject( "['하나','2','third']" );
- System.out.println( "jsonArray2:" + jsonArray2 );
- }
- }
Bean and Map to JSON :
- import net.sf.json.JSONFunction;
- public class TestBean {
- private String name = "json";
- private int num = 1;
- private char[] options = new char[]{ 'k', 'o', 'r' };
- private String func1 = "function(i) { return this.options[i]; }";
- private JSONFunction func2 = new JSONFunction(new String[]{"i"},"return this.options[i];");
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getNum() {
- return num;
- }
- public void setNum(int num) {
- this.num = num;
- }
- public char[] getOptions() {
- return options;
- }
- public void setOptions(char[] options) {
- this.options = options;
- }
- public String getFunc1() {
- return func1;
- }
- public void setFunc1(String func1) {
- this.func1 = func1;
- }
- public JSONFunction getFunc2() {
- return func2;
- }
- public void setFunc2(JSONFunction func2) {
- this.func2 = func2;
- }
- }
- import java.util.HashMap;
- import java.util.Map;
- import junit.framework.TestCase;
- import net.sf.json.JSONObject;
- public class JSONLibTest extends TestCase {
- public void testBeanMaps() {
- Map<String, Object> map = new HashMap<String, Object>();
- map.put( "string", "jin" );
- map.put( "bool", Boolean.TRUE );
- map.put( "int", new Integer(1) );
- map.put( "array", new String[]{"a","b"} );
- map.put( "function", "function(i){ return this.arr[i]; }" );
- JSONObject jsonObjectMap = JSONObject.fromObject( map );
- System.out.println( "jsonObjectMap:" + jsonObjectMap );
- JSONObject jsonObjectBean = JSONObject.fromObject( new TestBean() );
- System.out.println( "jsonObjectBean:" + jsonObjectBean );
- }
- }
JSON to Beans :
- import java.lang.reflect.InvocationTargetException;
- import java.util.List;
- import junit.framework.TestCase;
- import net.sf.json.JSONArray;
- import net.sf.json.JSONObject;
- import org.apache.commons.beanutils.PropertyUtils;
- public class JSONLibTest extends TestCase {
- @SuppressWarnings("unchecked")
- public void testJsonToBeans() throws
- IllegalAccessException, InvocationTargetException, NoSuchMethodException {
- String strJson = "{\"func1\":function(i) { return this.options[i]; },\"func2\":function(i){ return this.options[i]; },\"name\":\"json\",\"num\":1,\"options\":[\"k\",\"o\",\"r\"]}";
- JSONObject jsonObjectJsonToBeans = JSONObject.fromObject( strJson );
- Object beans = JSONObject.toBean( jsonObjectJsonToBeans );
- assertEquals( jsonObjectJsonToBeans.get( "name" ),
- PropertyUtils.getProperty( beans, "name" ) );
- assertEquals( jsonObjectJsonToBeans.get( "num" ),
- PropertyUtils.getProperty( beans, "num" ) );
- assertEquals( jsonObjectJsonToBeans.get( "func1" ),
- PropertyUtils.getProperty( beans, "func1" ) );
- assertEquals( jsonObjectJsonToBeans.get( "func2" ),
- PropertyUtils.getProperty( beans, "func2" ) );
- @SuppressWarnings("deprecation")
- List<String> expected = JSONArray.toList(jsonObjectJsonToBeans.getJSONArray("options"));
- assertEquals( expected, (List<String>) PropertyUtils.getProperty(beans, "options") );
- }
- }
Json to XML AND XML to JSON :
XMLSerializer.write()와 XMLSerializer.read() 를 사용하여 XML을 JSON으로 JSON을 XML로 변환할 수 있다.
- import junit.framework.TestCase;
- import net.sf.json.JSONArray;
- import net.sf.json.JSONObject;
- import net.sf.json.xml.XMLSerializer;
- public class JSONLibTest extends TestCase {
- public void testXML() {
- XMLSerializer xmlSerializer = new XMLSerializer();
- String strXml1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><book>" +
- "<title>XML To JSON</title><author>json-lib</author></book>";
- JSONObject jsonObject1 = (JSONObject) xmlSerializer.read(strXml1);
- System.out.println( jsonObject1 );
- JSONObject jsonObject2 = new JSONObject( true );
- String strXml2 = xmlSerializer.write( jsonObject2 );
- System.out.println( strXml2 );
- JSONArray jsonObject3 = JSONArray.fromObject("[1,2,3]");
- String strXml3 = xmlSerializer.write( jsonObject3 );
- System.out.println( strXml3 );
- System.out.println( "jsonObject1(json to xml):"+ xmlSerializer.read(strXml1) );
- System.out.println( "jsonObject2(json to xml):"+ xmlSerializer.read(strXml2) );
- System.out.println( "jsonObject3(json to xml):"+ xmlSerializer.read(strXml3) );
- }
- }
그런데 위의 소스를 돌려보면 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을 사용할 때 라이브러리를 추가한다.