首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 與 JSON 互轉完全指南:基於 json-lib 的實戰詳解

     編輯:Java 程式設計入門

為什麼選擇 json-lib?

json-lib 是早期成熟的 Java JSON 庫,支援 Bean、Map、Collection、陣列、XML 等多種類型雙向轉換。雖然目前 Gson、Jackson 更主流,但 json-lib 在許多老專案中仍在使用,理解其 API 有助於維護遺留代碼。

環境依賴(Maven 坐標)

<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、CollectionJSONArrayJSONArray.fromObject()
Map、自定義 BeanJSONObjectJSONObject.fromObject()

實戰範例(JUnit 4 風格)

1. 基礎類型與集合 → JSON

@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"]
}

2. Map → JSONObject

@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"]}
}

3. 復雜 Bean(含巢狀 List/Map) → JSON

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));
}

4. JSON 字符串 → Java 對象(含泛型集合)

@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());
}

5. Map 值的深度轉換(需 Morpher 註冊)

@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 自定義格式。
  • 循環引用:Bean 間雙向引用會導致棧溢出,需配置 JsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT)。
  • 泛型擦除:List/Map 泛型在運行時丟失,必須通過 classMap 顯式指定元素類型。
  • 性能:json-lib 基於反射,大數據量場景建議遷移至 Jackson/Gson。

遷移建議

新專案優先選用 Jackson(ObjectMapper)或 Gson,它們原生支援泛型、流式處理、注解驅動,且性能更優。json-lib 適合維護無法升級依賴的老系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved