用字符串表达式访问JSON数据(java,fastjson)

//单元科技-www.ccell.com.cn 技术部,开源
//XML数据有XPATH 如"root/rows[@id=1]/name"
//在JS中JSON数据可以对象方式访问
//java中怎么 用字符串表达式访问JSON数据? 找了很久没有找到,自己写一个,以减小代码量,让程序可读性变强
//用法:
//   JSONObject json = JSON.parseObject("{a:1,b:{}}");
//   JSONHelper.putByJPath(json, "b.abc", 123);
//   System.out.println(json);
//   System.out.println(JSONHelper.getByJPath(json, "b.abc", Integer.class));
//代码:
package com.ccell.json;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;


public class JSONHelper {

  public static  <T> Object getByJPath(JSONObject root, String jpath, Class<T> cls) {

    if (root == null) {
      return null;
    }

    if (jpath == null || "".equals(jpath)) {
     
      if (cls.equals(JSONObject.class)){
        return root;
      }else{
        return null;
      }
    }
   
    String[] names = jpath.split("\\.");
    String key = names[0];

    JSONObject jobj = null;
    Object result = null;

    if (key.matches("^.+(\\[\\d+\\])+$")) {

      String[] tmps = key.replaceAll("\\]", "").split("\\[");

      JSONArray jarray = root.getJSONArray(tmps[0]);

      if (jarray != null) {
        for (int j = 1; j < tmps.length; j++) {

          int index = Integer.parseInt(tmps[j]);
          if (j == tmps.length - 1) {
            if (names.length == 1) {
              result = jarray.getObject(index, cls);
            } else {
              jobj = jarray.getJSONObject(index);
              result = getByJPath(jobj, jpath.substring(key.length() + 1), cls);
            }
          } else {
            jarray = jarray.getJSONArray(index);
          }
        }
      }

    } else {

      if (names.length == 1) {
        result = root.getObject(key, cls);
      } else {
        jobj = root.getJSONObject(key);
        result = getByJPath(jobj, jpath.substring(key.length() + 1), cls);
      }

    }
   
    return result;
   
  }

  public static void putByJPath(JSONObject root, String jpath, Object value) {

    String key = jpath;
    String parentpath = "";
    int pos =  jpath.lastIndexOf(".");
    if (pos >= 0){
      key = jpath.substring(pos + 1);
      parentpath = jpath.substring(0,pos );     
    }

    JSONObject jobj = (JSONObject) getByJPath(root,parentpath,JSONObject.class);
    jobj.put(key, value);
   
  }
 
}

转载于:https://my.oschina.net/u/162811/blog/76501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值