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

