參考自 這裡
Preface:
最近要把視窗程式轉為 Web 介面的網頁, 因為該視窗程式包含蠻多服務, 所以想把 local 端的服務改成遠端呼叫的 web service. 如此該 Web 程式就可以專職顯示與人機互動. (即 MVC 中的 V=View). 在考慮 web service 間溝通的傳輸協定打算使用 json 格式, 故 survey 到 JSON-lib 這套 Java 的套件. 它的好處是可以直接將你已經用 Java 建立的物件 (map, bean etc) 直接轉為 json, 省掉你自己 coding 在 Java 世界與 json 世界中的轉換代碼, 相當方便. 下面將舉幾個範例提供後續使用參考.
Dependency and transformation limitation:
你要是用 JSON-lib 可以到 這裡下載 library, 但使用該 library 有下面相依性也要一併加入 classpath:
* jakarta commons-lang 2.5
* jakarta commons-beanutils 1.8.0
* jakarta commons-collections 3.2.1
* jakarta commons-logging 1.1.1
* ezmorph 1.0.6
需要注意的是上面對應的版本訊息, 如果你使用太新的版本, 可能會有不相容的問題.
再來是可以從 Java 世界到 json 世界的物件也不是每個都可以, 下面有個清單說明那些物件可以自由在兩端轉換:
接著就來看一些範例.
Working with arrays and collections:
首先我們要來看看如何在 Java 世界將 Collections 如 array 轉為 JSONArray 物件. 很直覺的是直接呼叫 JSONArray.fromObject() 方法就搞定:
執行結果:
From Beans & Maps to JSON:
如果是 key/value pairs 的形式, 則可以參考下面將 java 世界中的 Map 轉為 JSON 世界的 JSONObject 物件. 透過方法 JSONObject.fromObject() 可以完成這個轉換, 甚至你可以將自製的類別傳入該方法, 它會透過反射取出 getter/setter 對應的 key/value pairs 幫你生成對應 JSONObject:
執行結果:
From JSON to Beans:
既然能從 Java 世界轉換到 JSON 世界, 自然也能從 JSON 世界轉換回來 Java 世界. 可以透過 JSONObject.toBean() 方法完成 JSONObject->DynaBean 轉換:
上面使用
JUnit4 撰寫 TestCase, 執行結果應該 All-pass. 有了以上的說明與範例, 相信接下來應用應該就不成問題, 更多的使用與教學可以參考 這裡.
Supplement:
* JUnit4 Annotations : Test Examples and Tutorial
* JSON in Java
* Blog of toright> Java JSON API 教學 – Json-lib
Preface:
最近要把視窗程式轉為 Web 介面的網頁, 因為該視窗程式包含蠻多服務, 所以想把 local 端的服務改成遠端呼叫的 web service. 如此該 Web 程式就可以專職顯示與人機互動. (即 MVC 中的 V=View). 在考慮 web service 間溝通的傳輸協定打算使用 json 格式, 故 survey 到 JSON-lib 這套 Java 的套件. 它的好處是可以直接將你已經用 Java 建立的物件 (map, bean etc) 直接轉為 json, 省掉你自己 coding 在 Java 世界與 json 世界中的轉換代碼, 相當方便. 下面將舉幾個範例提供後續使用參考.
Dependency and transformation limitation:
你要是用 JSON-lib 可以到 這裡下載 library, 但使用該 library 有下面相依性也要一併加入 classpath:
* jakarta commons-lang 2.5
* jakarta commons-beanutils 1.8.0
* jakarta commons-collections 3.2.1
* jakarta commons-logging 1.1.1
* ezmorph 1.0.6
需要注意的是上面對應的版本訊息, 如果你使用太新的版本, 可能會有不相容的問題.
再來是可以從 Java 世界到 json 世界的物件也不是每個都可以, 下面有個清單說明那些物件可以自由在兩端轉換:
接著就來看一些範例.
Working with arrays and collections:
首先我們要來看看如何在 Java 世界將 Collections 如 array 轉為 JSONArray 物件. 很直覺的是直接呼叫 JSONArray.fromObject() 方法就搞定:
- package demo;
- import java.util.ArrayList;
- import java.util.List;
- import net.sf.json.JSONArray;
- public class Ex1 {
- public static void main(String[] args) {
- // 1.1) 建立 array
- boolean[] boolArray = new boolean[]{true,false,true};
- // 1.2) 轉換 Java 世界的 array 到 JSON 世界的 JSONArray
- JSONArray jsonArray = JSONArray.fromObject(boolArray);
- // 1.3) 檢查結果
- System.out.printf("\t[Info] jsonArray=%s\n", jsonArray); // prints [true,false,true]
- // 2.1) 建立 List 物件並添加元素.
- List
list = new ArrayList (); - list.add( "first" );
- list.add( "second" );
- // 2.2) 轉換 Java 世界的 List 到 JSON 世界的 JSONArray
- JSONArray jsonArray2 = JSONArray.fromObject( list );
- // 2.3) 檢查結果
- System.out.printf("\t[Info] jsonArray2=%s\n", jsonArray2); // prints ["first","second"]
- // 3.1) 透過 JSON 字串建立 JSONArray 物件.
- JSONArray jsonArray3 = JSONArray.fromObject( "['json','is','easy']" );
- // 3.2) 檢查結果
- System.out.printf("\t[Info] jsonArray3=%s\n", jsonArray3); // prints ["json","is","easy"]
- }
- }
From Beans & Maps to JSON:
如果是 key/value pairs 的形式, 則可以參考下面將 java 世界中的 Map 轉為 JSON 世界的 JSONObject 物件. 透過方法 JSONObject.fromObject() 可以完成這個轉換, 甚至你可以將自製的類別傳入該方法, 它會透過反射取出 getter/setter 對應的 key/value pairs 幫你生成對應 JSONObject:
- package demo;
- import java.util.List;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Map;
- import net.sf.json.JSONFunction;
- import net.sf.json.JSONObject;
- public class Ex2 {
- public static class MyBean
- {
- private String name = "json";
- private int pojoId = 1;
- private char[] options = new char[]{'a','f'};
- private String func1 = "function(i){ return this.options[i]; }";
- private JSONFunction func2 = new JSONFunction(new String[]{"i"},"return this.options[i];");
- private List
choices = new ArrayList(); - public MyBean()
- {
- choices.add("Choice1");
- choices.add("Choice2");
- }
- public MyBean(String name, int pid, char[] opts, String func1, JSONFunction func2, List
choices) - {
- this.name = name;
- this.pojoId = pid;
- this.options = opts;
- this.func1 = func1;
- this.func2 = func2;
- this.choices = choices;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getPojoId() {
- return pojoId;
- }
- public void setPojoId(int pojoId) {
- this.pojoId = pojoId;
- }
- 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;
- }
- public List
getChoices() { - return choices;
- }
- public void setChoices(List
choices) { - this.choices = choices;
- }
- }
- public static void main(String[] args) {
- Map
map = new HashMap (); - map.put( "name", "json" );
- map.put( "bool", Boolean.TRUE );
- map.put( "int", new Integer(1) );
- map.put( "arr", new String[]{"a","b"} );
- map.put( "func", "function(i){ return this.arr[i]; }" );
- // 1) 轉換 Java 世界的 Map 物件到 JSON 世界的 JSONObject 物件.
- JSONObject jsonObject = JSONObject.fromObject(map);
- System.out.printf("\t[Info] jsonObject=%s\n", jsonObject);
- // 2) 轉換 Java 世界的 Bean 物件到 JSON 世界的 JSONObject 物件.
- JSONObject jsonObject2 = JSONObject.fromObject(new MyBean());
- System.out.printf("\t[Info] jsonObject2=%s\n", jsonObject2);
- }
- }
From JSON to Beans:
既然能從 Java 世界轉換到 JSON 世界, 自然也能從 JSON 世界轉換回來 Java 世界. 可以透過 JSONObject.toBean() 方法完成 JSONObject->DynaBean 轉換:
- package demo;
- import static org.junit.Assert.assertEquals;
- import java.util.List;
- import net.sf.json.JSONArray;
- import net.sf.json.JSONObject;
- import org.apache.commons.beanutils.PropertyUtils;
- import org.junit.Test;
- import demo.Ex2.MyBean;
- public class Ex3 {
- public static class MyBean
- {
- private String name = "name";
- private int id = 1;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- @Override
- public boolean equals(Object o)
- {
- if(o instanceof MyBean)
- {
- MyBean bean = (MyBean)o;
- if(bean.name.equals(name) && bean.id == id) return true;
- }
- return false;
- }
- }
- @Test
- public void test() throws Exception{
- // 1) Convert to DynaBean:
- String json = "{name=\"json\",bool:true,int:1,double:2.2,func:function(a){ return a; },array:[1,2]}";
- JSONObject jsonObject = JSONObject.fromObject(json);
- Object bean = JSONObject.toBean( jsonObject );
- assertEquals( jsonObject.get( "name" ), PropertyUtils.getProperty( bean, "name" ) );
- assertEquals( jsonObject.get( "bool" ), PropertyUtils.getProperty( bean, "bool" ) );
- assertEquals( jsonObject.get( "int" ), PropertyUtils.getProperty( bean, "int" ) );
- assertEquals( jsonObject.get( "double" ), PropertyUtils.getProperty( bean, "double" ) );
- assertEquals( jsonObject.get( "func" ), PropertyUtils.getProperty( bean, "func" ) );
- List expected = JSONArray.toList( jsonObject.getJSONArray( "array" ) );
- assertEquals("List size=2", 2, expected.size());
- // 2) Convert to MyBean:
- MyBean bean2 = new MyBean();
- JSONObject jsonObject2 = JSONObject.fromObject(bean2);
- MyBean tbean = (MyBean)JSONObject.toBean(jsonObject2, MyBean.class);
- assertEquals(bean2, tbean);
- }
- }
Supplement:
* JUnit4 Annotations : Test Examples and Tutorial
* JSON in Java
* Blog of toright> Java JSON API 教學 – Json-lib
This message was edited 20 times. Last update was at 21/01/2013 14:10:34
沒有留言:
張貼留言