把字符串轉化爲json

把字符串轉化爲json

任務:

把字符串

{"name":"黃威","age":27,"address":"{\"district\":\"海淀區\",\"street\":\"回龍觀西大街\",\"building\":\"通達園\"}","score":0}

轉化爲:

{"name":"黃威","age":27,"address":{"district":"海淀區","street":"回龍觀西大街","building":"通達園"},"score":0}



代碼:

    /***
     * 最大限度地當做json 字符串解析<br />
     * 方案:"[...]" 轉爲[...],並且其中的\"-->"<br />
     * "{...}" 轉爲{...},並且其中的\"-->"<br />
     * @param jsonStr
     * @return
     */
    public static String toJson(String jsonStr) {
        if (ValueWidget.isNullOrEmpty(jsonStr)) {
            return null;
        }
        if (ValueWidget.isHTMLWebPage(jsonStr)) {
            return jsonStr;
        }

        if (!jsonStr.trim().startsWith("{")) {
            return jsonStr;
        }
        JSONObject jsonObject = null;
        try {
            jsonObject = JSONObject.parseObject(jsonStr);
        } catch (Exception e) {
            e.printStackTrace();
            return jsonStr;
        }

        ParseJsonInfo parseJsonInfo = toJsonObjectRecursive(jsonObject);
        if (parseJsonInfo.isHasString()) {
            return jsonObject.toJSONString();
        }

        return jsonStr;
    }

    /**
     * 最大限度地當做json 字符串解析<br />
     * 方案:"[...]" 轉爲[...],並且其中的\"-->"<br /
     *
     * @param jsonObject
     * @return
     */
    public static ParseJsonInfo toJsonObjectRecursive(JSONObject jsonObject) {
//        JSONObject jsonObject=JSONObject.parseObject(jsonStr);
        Set<Map.Entry<String, Object>> set = jsonObject.entrySet();
//        boolean hasString=false;
        ParseJsonInfo parseJsonInfo = new ParseJsonInfo();
        for (Map.Entry<String, Object> entry : set) {
//            System.out.println("key :" + entry.getKey());
            Object val = entry.getValue();
            String key = entry.getKey();
//            System.out.println("value :" + val);
            if (val instanceof String) {
                String valString = (String) val;
                valString = valString.trim();
                if (valString.contains(":") && valString.contains("\"")) {//判斷是否是json字符串,比如{"username":"whuang"}
//                    hasString=true;
                    if (valString.startsWith("[")) {//"[...]"--數組
                        JSONArray jsonArray = JSONObject.parseArray(valString);
                        parseArray(parseJsonInfo, jsonArray);
                        jsonObject.put(key, jsonArray);
                    } else {//--對象
                        ParseJsonInfo parseJsonInfoTmp = toJsonObjectRecursive(JSONObject.parseObject(valString));
                        jsonObject.put(key, parseJsonInfoTmp.getJsonObject());
                    }

                    parseJsonInfo.setHasString(true);
                }
            } else if (val instanceof JSONObject) {
                ParseJsonInfo parseJsonInfoTmp = toJsonObjectRecursive((JSONObject) val);
                if (parseJsonInfoTmp.isHasString()) {
                    parseJsonInfo.setHasString(true);
                }
            }
//            System.out.println("value type :" +(val instanceof String));
//            String val2=JSONHWUtil.unescapeJava((String)val);
//            System.out.println("val2 :" + val2);

        }
        parseJsonInfo.setJsonObject(jsonObject);
        return parseJsonInfo;
    }

    public static void parseArray(ParseJsonInfo parseJsonInfoParent, JSONArray jsonArray) {
        int size = jsonArray.size();
        for (int i = 0; i < size; i++) {
            Object object = jsonArray.get(i);
            if (object instanceof JSONObject) {
                ParseJsonInfo parseJsonInfoTmp = toJsonObjectRecursive((JSONObject) object);
                if (parseJsonInfoTmp.isHasString()) {
                    parseJsonInfoParent.setHasString(true);
                    jsonArray.set(i, parseJsonInfoTmp.getJsonObject());
                }

            }
        }
    }

  依賴的庫:

 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.6</version>
        </dependency>

 

完整代碼 見附件中的com/io/hw/json/JSONHWUtil.java

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章