最近工做中,常常須要對json作解析,而json的格式又不統一,實際使用也就是獲取json中的一個節點值。因而就想經過寫json路徑的方式來直接拿到節點值,這樣就就不用對不一樣格式的json數據單獨寫解析方法了。下面這段代碼可以很好的解決這個問題,給對於和我有一樣需求的童鞋作個參考。另外對於接口測試,在個人phoenixframework平臺中的phoenix_interface裏面還有不少諸如此類的工具,會給開發工做帶來很大的方便。java
import java.util.HashMap; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class JsonPaser { /** * 對節點進行解析 * * @author mengfeiyang * @param obj * @param node * @return */ private static JSONObject getObj(JSONObject obj, String node) { try { if (node.contains("[")) { JSONArray arr = obj.getJSONArray(node.substring(0,node.indexOf("["))); for (int i = 0; i < arr.length(); i++) { if ((i + "").equals(node.substring(node.indexOf("["),node.indexOf("]")).replace("[", ""))) { return arr.getJSONObject(i); } } } else { return obj.getJSONObject(node); } } catch (Exception e) { return obj; } return null; } /** * 獲取節點值 * @author mengfeiyang * @param jsonContent * @param jsonPath * @return * @throws Exception */ public static synchronized String getNodeValue(String jsonContent, String jsonPath) throws Exception { String[] nodes = jsonPath.split("\\."); JSONObject obj = new JSONObject(jsonContent); for (int i = 1; i < nodes.length; i++) { if (obj != null) { obj = getObj(obj, nodes[i]); } if ((i + 1) == nodes.length) { try{ return obj.getString(nodes[i]); }catch(Exception e){ return "JSONException:"+e.getMessage()+",NodeString:"+obj.toString(); } } } return null; } public static void main(String[] args) throws Exception { //構造json字符串 String jsonContent = "{\"projectName\":\"JSON\",\"projectInfo\":{\"author\":\"test\",\"version\":1.0}}"; String val = JsonPaser.getNodeValue(jsonContent, "JSON.projectInfo.author"); System.out.println(val);//執行結果:test } }
如上代碼中json字符串的樹結構以下:node
獲取author的json路徑就是:JSON.projectInfo.author,是否是方便了不少呢。chrome
在實際使用時,這樣的json路徑很容易得到,例如經過chrome的json插件。json