json-lib 是早期成熟的 Java JSON 庫,支援 Bean、Map、Collection、陣列、XML 等多種類型雙向轉換。雖然目前 Gson、Jackson 更主流,但 json-lib 在許多老專案中仍在使用,理解其 API 有助於維護遺留代碼。
<dependencies>
<dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version><classifier>jdk15</classifier></dependency>
<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.9.4</version></dependency>
<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.2</version></dependency>
<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>
<dependency><groupId>net.sf.ezmorph</groupId><artifactId>ezmorph</artifactId><version>1.0.6</version></dependency>
</dependencies>
| Java 類型 | JSON 類型 | 轉換類 |
|---|---|---|
| 陣列、List、Collection | JSONArray | JSONArray.fromObject() |
| Map、自定義 Bean | JSONObject | JSONObject.fromObject() |
@Test public void testArrayToJSON() {
boolean[] arr = {true, false, true};
System.out.println(JSONArray.fromObject(arr)); // [true,false,true]
}
@Test public void testListToJSON() {
List<String> list = Arrays.asList("first", "second");
System.out.println(JSONArray.fromObject(list)); // ["first","second"]
}
@Test public void testMapToJSON() {
Map<String, Object> map = new HashMap<>();
map.put("name", "json");
map.put("bool", Boolean.TRUE);
map.put("int", 1);
map.put("arr", new String[]{"a","b"});
System.out.println(JSONObject.fromObject(map));
// {"name":"json","bool":true,"int":1,"arr":["a","b"]}
}
public class MyBean {
private String id, name;
private Date date;
private List<Object> cardNum; // 可混合 String、Person 等
// getter/setter 略
}
@Test public void testBeanToJSON() {
MyBean bean = new MyBean();
bean.setId("001"); bean.setName("銀行卡"); bean.setDate(new Date());
bean.setCardNum(Arrays.asList("農行", "工行", "建行", new Person("test")));
System.out.println(JSONObject.fromObject(bean));
}
@Test public void testJSONToBeanWithList() throws Exception {
String json = "{list:[{name:'test1'},{name:'test2'}], map:{test1:{name:'test1'}}}";
Map<String, Class> classMap = new HashMap<>();
classMap.put("list", Person.class); // 指定 List 泛型類型
classMap.put("map", Map.class);
MyBeanWithPerson bean = (MyBeanWithPerson) JSONObject.toBean(
JSONObject.fromObject(json), MyBeanWithPerson.class, classMap);
for (Person p : bean.getList()) System.out.println(p.getName());
}
@Test public void testJSONToBeanWithMap() {
String json = "{map:{testOne:{name:'test1'},testTwo:{name:'test2'}}}";
Map<String, Class> classMap = new HashMap<>();
classMap.put("map", Map.class);
MyBeanWithPerson bean = (MyBeanWithPerson) JSONObject.toBean(
JSONObject.fromObject(json), MyBeanWithPerson.class, classMap);
// 預設 Map 值為 MorphDynaBean,需註冊 Morpher 轉為 Person
MorpherRegistry registry = JSONUtils.getMorpherRegistry();
registry.registerMorpher(new BeanMorpher(Person.class, registry));
List<Person> result = new ArrayList<>();
for (Object v : bean.getMap().values()) {
result.add((Person) registry.morph(Person.class, v));
}
result.forEach(p -> System.out.println(p.getName()));
}
java.util.Date 為毫秒數,可用 JsonConfig 註冊 DateJsonValueProcessor 自定義格式。JsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT)。classMap 顯式指定元素類型。新專案優先選用 Jackson(ObjectMapper)或 Gson,它們原生支援泛型、流式處理、注解驅動,且性能更優。json-lib 適合維護無法升級依賴的老系統。