HengYk Blog

个人站

具有浪漫主义情调的理想主义务实青年


Java org.json HE Json-lib

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

3. 参考