使用json-lib將JSONObject轉Java物件,JSONArray轉Java集合
阿新 • • 發佈:2019-02-19
解析用的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);
}
}