javascript
Jackson第二篇【从JSON字符串中取值】
來源:http://blog.csdn.net/songyongfeng/article/details/6932674
第一篇咱們主要學習了實體與json的相互轉換的問題,但是咱們需要的是數據 你轉換18遍我取不到數據也是扯淡,那么今天咱們就一起學習一下如何從使用Jackson從Json字符串中取值。廢話不說直接上代碼。
從Json字符串中取出指定節點的值
怎么樣功能還行吧?如果這樣你就滿意了,那你也太容易滿足了。現在我在項目中需要像xpath那樣來查找某節點的值(不太了解xpath的童鞋別著急我以后會和大家一起學習下)。/a/b/c/d 這樣找到某個節點的值。為了增加復雜度,我又給Person類里面增加 一個List<Person> childs;表示這個人的孩子那么咱們一往下需找的節點就多了……
? 首先看下我準備的數據
{"voName":"一個容器而已","pers":[{"name":"張三","age":46,"childs":[{"name":"小張三1","age":20,"childs":null},{"name":"小張三2","age":17,"childs":null}]},{"name":"李四","age":29,"childs":[{"name":"小李四1","age":20,"childs":null}]},{"name":"王二麻子","age":23,"childs":null}]}張三:有兩個孩子 李四:有一個孩子 王二麻子:沒有孩子
我現在要做的就是把所有的孩子找出來。
廢話不多說直接看代碼
public static void main(String[] args) throws Exception { // 準備數據 List<Person> pers = new ArrayList<Person>(); List<Person> childs = new ArrayList<Person>(); Person p = new Person("張三", 46); childs.add(new Person("小張三1", 20)); childs.add(new Person("小張三2", 17)); p.setChilds(childs); pers.add(p); p = new Person("李四", 29); childs = new ArrayList<Person>(); childs.add(new Person("小李四1", 20)); p.setChilds(childs); pers.add(p); p = new Person("王二麻子", 23); pers.add(p); TestVo vo = new TestVo("一個容器而已", pers); // 實體轉JSON字符串 String json = CommonUtil.beanToJson(vo); Object[] obj = readValueFromJson(json, "pers:childs:name").toArray(); System.out.println( Arrays.toString(obj) ); // 輸出結果:[小張三1, 小張三2, 小李四1] }
好玩吧,接下來咱們就一起看下我這個readValueFormJson是如何實現的呢?
/*** 從json中讀取tagPath處的值 tagPath用 :分隔* * @param json* @param tagPath* @return* @throws Exception*/public static List<String> readValueFromJson(String json, String tagPath) throws Exception {// 返回值List<String> value = new ArrayList<String>();if (CommonUtil.isEmpty(json) || (CommonUtil.isEmpty(tagPath))) {return value;}ObjectMapper mapper = CommonUtil.getMapperInstance(false);String[] path = tagPath.split(":");JsonNode node = mapper.readTree(json);getJsonValue(node, path, value, 1);return value;}public static void getJsonValue(JsonNode node, String[] path, List<String> values, int nextIndex) {if (CommonUtil.isEmpty(node)) {return;}// 是路徑的最后就直接取值if (nextIndex == path.length) {if (node.isArray()) {for (int i = 0; i < node.size(); i++) {JsonNode child = node.get(i).get(path[nextIndex - 1]);if (CommonUtil.isEmpty(child)) {continue;}values.add(child.toString());}} else {JsonNode child = node.get(path[nextIndex - 1]);if (!CommonUtil.isEmpty(child)) {values.add( child.toString() );}}return;}// 判斷是Node下是集合還是一個節點node = node.get(path[nextIndex - 1]);if (node.isArray()) {for (int i = 0; i < node.size(); i++) {getJsonValue(node.get(i), path, values, nextIndex + 1);}} else {getJsonValue(node, path, values, nextIndex + 1);}}
挺好吧,功能雖然實現了。但是童鞋們可能會對這個產生疑問,你他X的不是脫褲子放屁嗎?先把Bean轉換成Json再從Json中取值。效率低不說,而且還復雜。我直接通過get方法多好……如果你這樣想了說明你是一個思考者!但是有種情況(本人在開發中遇到的)如果這個bean非常大 不同情況你需要的字段是不一樣的 那你怎辦? 根據情況判斷if else if else if?如果有一百種情況呢?那不就累死了。所以在數據庫里面配置不同業務情況從不同字段取值比較好,這樣就會用到這種功能。另外附上:CommonUtil.isEmpty()方法
總結
以上是生活随笔為你收集整理的Jackson第二篇【从JSON字符串中取值】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络计算机显示10,win10电脑网络显
- 下一篇: 数据库事务的概念及其实现原理