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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

//单元科技-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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言学习

时间&#xff1a;20160302 (1) C语言中&#xff0c;很多标准头文件&#xff0c;这样的头文件好处在于&#xff0c;所有的实现方法都在头文件中进行定义&#xff0c;后期对方法进行修改时&#xff0c;可以只需要改动头文件&#xff0c;就可以了&#xff0c;其他的地方也需要对应…

怎样分辨谁才是朋友圈里的真·贵族?

不是我不明白&#xff0c;这世界变化快但在这个看1分钟视频都要2倍速的世界里有一群人却仍然愿意每天花5分钟阅读2000字以上的文字信息这是多么高贵的一种精神所以高贵的你&#xff0c;值得更好的内容今天我们精选出8个优质公号他们有趣有料、有思想有温度绝对值得你的关注长按…

Android之如何解决Android studio运行出现的HAX kernel modules is not installed

HAX kernel modules is not installed 很久之前,我安装了Android studio,运行时控制台打印出这个,emulator:ERROR:x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is properly installed and useble, CPU acceleration statis:HAX kern…

Elastic AMP监控.NET程序性能

什么是Elastic AMPElastic APM 是一个应用程序性能监控系统。它可以请求的响应时间、数据库查询、对缓存的调用、外部 HTTP 请求等的详细性能信息&#xff0c;可以实时监控软件服务和应用程序。这可以帮助我们快速查明和修复性能问题。Elastic APM 还会自动收集未处理的错误和异…

java分页的工具类,java分页工具类

PageBean-分页package com.soyea.util;import java.io.Serializable;import java.util.List;/*** 分页工具类*/public class PageBean implements Serializable {private static final long serialVersionUID -8741766802354222579L;private int pageSize5; // 每页显示多少条…

xxx定律-poj-3782

xxx定律 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1639 Accepted Submission(s): 1303 Problem Description 对于一个数n&#xff0c;如果是偶数&#xff0c;就把n砍掉一半&#xff1b;如果是奇数&#x…

asp.net 检测访问者是iphone,android,web(摘录)

aps.net 可以使用WebFormViewEngine来实现。 参考文章&#xff1a;http://www.hanselman.com/blog/MixMobileWebSitesWithASPNETMVCAndTheMobileBrowserDefinitionFile.aspx 源代码 C#代码 public class MobileCapableWebFormViewEngine : WebFormViewEngine { public…

在Android NDK中使用OpenSSL

从 6.0 开始&#xff0c;Google 要求不要使用系统的 OpenSSL&#xff0c;请见&#xff1a;https://developer.android.com...。因此&#xff0c;请不要再使用本文介绍的方法&#xff0c;请自行交叉编译 OpenSSL 或者使用别人编译好的版本。2017年3月注 由于Java较为容易被反编译…

字符串之数字子串求和

题目:给定一个字符串str,求其中全部数字串所代表的数字之和 要求: 1、忽略小数点字符,例如“A1.3”,其中包括2个数字1和3 2、如果是紧贴数字子串的左侧出现字符“-”,当连续出现的数量为奇数时,则数字视为负,连续出现的数量为偶数的则 数字视为正,例如,“A-1…

买的情侣裤衩寄前男友家了,怎么办?

1 那你是要和别人一起去吗&#xff01;▼2 我马上想到我一老师了&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 当代父母对孩子的期望变化&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 这个小象打破我的观念&#xff1f;▼5 小个子买…

ctf php sql注入,CTF—攻防练习之HTTP—SQL注入(SSI注入)

主机&#xff1a;192.168.32.152靶机&#xff1a;192.168.32.161ssI是赋予html静态页面的动态效果&#xff0c;通过ssi执行命令&#xff0c;返回对应的结果&#xff0c;若在网站目录中发现了.stm .shtm .shtml等&#xff0c;且对应SSL输入没有过滤该网站可能存在SSI注入漏洞ssi…

OAuth 2.1 带来了哪些变化

OAuth 2.1 是 OAuth 2.0 的下一个版本, OAuth 2.1 根据最佳安全实践(BCP), 目前是第18个版本&#xff0c;对 OAuth 2.0 协议进行整合和精简, 移除不安全的授权流程, 并发布了 OAuth 2.1 规范草案, 下面列出了和 OAuth 2.0 相比的主要区别。⚡ 推荐使用 Authorization Code PKC…

转仁兄:Binary search and its variation

http://fihopzz.blogspot.com/2013/07/enter-post-title-here-binary-search-and.html转载于:https://www.cnblogs.com/kwill/p/3230655.html

生孩子要趁早 3

说到猝死&#xff0c;前两天又有报道说哪个搞IT的年纪轻轻的嗝儿屁了&#xff1b;我想&#xff1a;其实哪个行业都有这么几个倒霉孩子&#xff1b;这也就是搞网络报道的公司的身边的事儿&#xff0c;才被程序员们通过网络转来转去&#xff1b;那些搬砖、运煤的就没有年纪轻轻累…

使用OClint进行iOS项目的静态代码扫描

使用OClint进行iOS项目的静态代码扫描 原文链接&#xff1a;http://blog.yourtion.com/static-code-analysis-ios-using-oclint.html 最近需要一个静态分析代码工具&#xff0c;帮助我们发布运行应用前找到代码潜在的问题。 其实对于iOS开发&#xff0c;我们的日常开发上已经用…

Linux命令常用大全

系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo…

54个站在人类智商巅峰的男人!告诉你2400年的物理学史里都有什么……

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不至于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

C#实现ByteBuffer类 .

在写网络程序的时候,经常需要往一个数组里面压数据或者取数据,而Java中再Java.nio中有个ByteBuffer能很方便的实现,Delphi中也有个Stream类有着同样的功能,这里我就模仿JAVA用C#做个最基础的ByteBuffer类 下面是代码 usingSystem;namespaceSystem.ByteBuffer...{ /**//// &l…

mysql中如何删除表中int约束,MySQL中的约束,添加约束,删除约束,以及其他修饰

一.NOT NULL(非空约束)添加非空约束1)建表时直接添加CREATE TABLE t_user(user_id INT(10) NOT NULL);2)通过ALTER 语句ALTER TABLE t_user MODIFY user_id INT(10) NOT NULL;ALTER TABLE t_user CHANGE user_id user_id INT(10) NOT NULL;删除非空约束1)ALTER TABLE t_user MO…

asp.net 6中的mini api和mvc api性能对比

在.net6发布时&#xff0c;带来了一个新的模板框架&#xff0c;mini api&#xff0c;那与之前的mvc api性能对比是什么样的呢&#xff1f;建了基于.net 6的两种模板项目&#xff0c;都实现了一个get /test01的api请求&#xff0c;代码如下&#xff1a;mini api:app.MapGet(&quo…