1. 程式人生 > >使用json-lib將JSONObject轉Java物件,JSONArray轉Java集合

使用json-lib將JSONObject轉Java物件,JSONArray轉Java集合

解析用的json包

gradle 引用

net.sf.json-lib:json-lib:2.4:jdk15

待轉換用的Json物件(userString)

{
    "Name": "nameA",
    "title": "title1",
    "orders": [
        {
            "Sn": 123,
            "amount": 20.50,
            "items": [
                {
                    "pid": "p_1",
                    "pName"
: "p1_name" } ] }, { "Sn": 456, "amount": 23.00, "items": [ { "pid": "p_2", "pName": "p2_name" } ] } ] }

待轉換用的Json陣列(userArrString)

[
    {
        "Name": "nameA",
        "title": "title1",
        "orders": [
            {
                "Sn": 123,
                "amount": 30.50,
                "items": [
                    {
                        "pid": "p_1",
                        "pName": "p1_name"
                    }
                ]
            },
            {
                "Sn"
: 456, "amount": 24.50, "items": [ { "pid": "p_2", "pName": "p2_name" } ] } ] }, { "Name": "nameB", "title": "title2", "orders": [ { "Sn": 223, "items": [ { "pid": "p_3", "pName": "p3_name" } ] }, { "Sn": 446, "items": [ { "pid": "p_5", "pName": "p5_name" } ] } ] } ]

對應的三個Java類,省略了相應的getter/setter方法

一個User對應多個Order,一個Order對應多個Item

public class User implements Serializable {
    private String name;
    private List<Order> orders;
    .....
}

public class Order implements Serializable {
    private String sn;
    private BigDecimal amount;
    private Set<Item> items;
    ......
}

public class Item implements Serializable {
    private String pid;
    private String pName;
    ......
}

JsonObject轉java物件

@Test
public void testJson2Obj() {
    try {
        JSONObject userJson = JSONObject.fromObject(userString);
        User u = (User) JSONObject.toBean(userJson, getJsonConfig());
        printUser(u);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
* 因json物件中的key以大寫字母開頭,而java類中的屬性是小寫字母
* 此方法用於將json中的key的首字母變為小寫,以適應java類中的屬性名
*
*/
class unCapitalPropertyNameProcessor implements PropertyNameProcessor {

    @Override
    public String processPropertyName(Class arg0, String arg1) {
        return StringUtils.uncapitalize(arg1);
    }
}

/**
* 定義jsonConfig
*
*/
private JsonConfig getJsonConfig() {
    JsonConfig jsonConfig = new JsonConfig();

    //要將json轉為user
    jsonConfig.setRootClass(User.class);

    //設定json中陣列要對應的java物件
    Map<String, Class<?>> map = new HashMap<String, Class<?>>();
    map.put("orders", Order.class);
    map.put("items", Item.class);
    jsonConfig.setClassMap(map);

    //註冊java屬性名處理器
    //如果不註冊的話,會因為json中的key的值與java中的屬性名稱不同而無法將value值設定到相應的java屬性中
    jsonConfig.registerJavaPropertyNameProcessor(User.class, new unCapitalPropertyNameProcessor());
    jsonConfig.registerJavaPropertyNameProcessor(Order.class, new unCapitalPropertyNameProcessor());

    return jsonConfig;
}

JSONArray轉Java集合

JSON陣列轉java集合與json物件轉java物件相同

@Test
public void testJsonArray2List() {
    JSONArray userJsonArr = JSONArray.fromObject(userArrString);
    List<User> list = (List<User>) JSONArray.toCollection(userJsonArr, getJsonConfig());
    for (User u : list) {
        printUser(u);
    }
}