org.json和Json-lib联系与区别
1. 联系
下面代码中 org.json 和 net.sf.json 的构造和解析是相同的。
public static JSONObject construct() {
JSONObject jsonObj = new JSONObject();
jsonObj.put("name", "inITial2");
String[] likes = new String[]{"JAVAScript", "Skiing", "Apple Pie"};
jsonObj.put("likes", likes);
Map<String, String> ingredients = new HashMap<>();
ingredients.put("apples", "12kg");
ingredients.put("sugar", "7kg");
ingredients.put("pastry", "10.8kg");
ingredients.put("bestEaten", "outdoors");
jsonObj.put("ingredients", ingredients);
Map<String, String> ingredientsOne = new HashMap<>();
ingredientsOne.put("apples", "3kg");
ingredientsOne.put("sugar", "1kg");
ingredientsOne.put("pastry", "2.4kg");
ingredientsOne.put("bestEaten", "out");
Map<String, String> ingredientsTwo = new HashMap<>();
ingredientsTwo.put("apples", "9kg");
ingredientsTwo.put("sugar", "6kg");
ingredientsTwo.put("pastry", "8.4kg");
ingredientsTwo.put("bestEaten", "doors");
List<Object> ingredientList = new ArrayList<>();
ingredientList.add(ingredientsOne);
ingredientList.add(ingredientsTwo);
jsonObj.put("ingredientList", ingredientList);
return jsonObj;
}
public static void analyze(JSONObject jo) {
String name = jo.getString("name");
JSONObject ingredients = jo.getJSONObject("ingredients");
String bestEaten = ingredients.getString("bestEaten");
JSONArray ingredientList = jo.getJSONArray("ingredientList");
for (Object anIngredientList : ingredientList) {
JSONObject temp = (JSONObject) anIngredientList;
String bestEatenTemp = temp.getString("bestEaten");
}
}
{
"name": "inITial",
"ingredientList": [
{
"pastry": "2.4kg",
"apples": "3kg",
"sugar": "1kg",
"bestEaten": "outdoors"
},
{
"pastry": "2.4kg",
"apples": "3kg",
"sugar": "1kg",
"bestEaten": "xixi"
}
],
"ingredients": {
"pastry": "2.4kg",
"apples": "3kg",
"sugar": "1kg",
"bestEaten": "outdoors"
},
"likes": [
"JAVAScript",
"Skiing",
"Apple Pie"
]
}
2. 区别
a) org.json比json-lib的使用要轻量得多。依赖树如下:
+-- Json-lib:
| +-- commons-beanutils-1.8.0.jar
| +-- commons-collections-3.2.1.jar
| +-- commons-lang-2.5.jar
| +-- commons-logging-1.1.1.jar
| +-- ezmorph-1.0.6.jar
| +-- json-lib-2.4-jdk15.jar
+-- org.json:
| +-- json-20180813.jar
b) JSON字符串转JSONObject的方式不同;
c) org.json.JSONObject 在进行如下类型转换时不会损失精度,而net.sf.json.JSONObject会损失精度。
d) org.json.JSONObject 出现类型不匹配异常;net.sf.json.JSONObject 没有出现同样的异常,但是损失精度。
e) org.json.JSONObject 和 net.sf.json.JSONObject 获取getJSONArray长度的方式不同。
public class TestDiff {
public static class BalanceDto {
private String availableBalance;
public BalanceDto() {
}
public String getAvailableBalance() {
return availableBalance;
}
public void setAvailableBalance(String availableBalance) {
this.availableBalance = availableBalance;
}
public String toString() {
return "availableBalance " + availableBalance;
}
}
public static void main(String[] args) {
String str = "{\"code\":\"0000\", \"msg\":{\"availableBalance\":31503079.02}}";
// 1. JSON字符串转JSONObject的方式不同
org.json.JSONObject jsonObject = new org.json.JSONObject(str);
System.out.println(jsonObject);
net.sf.json.JSONObject jsonObject1 = net.sf.json.JSONObject.fromObject(str);
System.out.println(jsonObject1);
/*
{"msg":{"availableBalance":3.150307902E7},"code":"0000"}
{"code":"0000","msg":{"availableBalance":3.150308E7}}
*/
// 2. org.json.JSONObject 在进行如下类型转换时不会损失精度,而net.sf.json.JSONObject会损失精度。
Double value = jsonObject.getJSONObject("msg").getDouble("availableBalance");
System.out.println(value);
// 报错:org.json.JSONException: JSONObject["availableBalance"] not a string.
// String value2 = jsonObject.getJSONObject("msg").getString("availableBalance");
// System.out.println(value2);
String value3 = jsonObject1.getJSONObject("msg").getString("availableBalance");
System.out.println(value3);
Double value4 = jsonObject1.getJSONObject("msg").getDouble("availableBalance");
System.out.println(value4);
/*
3.150307902E7 (无精度损失)
3.150308E7 (有精度损失)
3.150308E7 (有精度损失)
*/
// 3. org.json.JSONObject 出现类型不匹配异常;net.sf.json.JSONObject 没有出现同样的异常,但是损失精度。
// 报错:java.lang.ClassCastException: java.lang.String cannot be cast to cn.edu.xidian.ictt.yk.TestDiff$BalanceDto
// BalanceDto bd = (BalanceDto) org.json.JSONObject.stringToValue(jsonObject.getJSONObject("msg").toString());
// System.out.println(bd);
// 使用toBean(JSONObject jsonObject, Class beanClass)应注意以下两点:
// 其一,类要有空的构造方法;其二,如果是内部类,要是静态类。
BalanceDto bd2 = (BalanceDto) net.sf.json.JSONObject.toBean(jsonObject1.getJSONObject("msg"), BalanceDto.class);
System.out.println(bd2);
/*
availableBalance 3.150308E7
*/
// 4. org.json.JSONObject 和 net.sf.json.JSONObject 获取getJSONArray长度的方式不同
String str2 = "{\"code\":\"0000\", \"msg\":[{\"availableBalance\":31503079.02}]}";
org.json.JSONObject jsonObj = new org.json.JSONObject(str2);
org.json.JSONArray ja = jsonObj.getJSONArray("msg");
System.out.println(ja.length());
net.sf.json.JSONObject jsonObj2 = net.sf.json.JSONObject.fromObject(str2);
net.sf.json.JSONArray ja1 = jsonObj2.getJSONArray("msg");
System.out.println(ja1.size());
}
}