精华内容
下载资源
问答
  • JAVA中获取JSON中某个对象的
    千次阅读
    2021-05-27 23:47:46

    在JAVA中获取JSON中某个对象的值

    public class ChangeJson {
        public static String getString(String data, String result)  {
            JSONObject jsonObject = null;
            try {
                jsonObject = new JSONObject(data);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return jsonObject.optString(result, null);
        }
    }
    

    使用方式
    现在String result中有如下的JSON串,要取得deptCode
    {
    “status”: 0,
    “data”: {
    “deptId”: 76,
    “deptCode”: “101030000”,
    “deptName”: “成都工务段”,
    “dirDeptCode”: “100000000”,
    “deptLevel”: 2,
    “defaultRoleId”: 1,
    “createAt”: “2021-02-25 02:18:51”,
    “updateAt”: “2021-03-03 09:09:35”,
    “defaultRoleName”: “系统超级管理员”
    }
    }

    String data = ChangeJson.getString(result, "data");
    String deptCode= ChangeJson.getString(data , "deptCode");
    
    更多相关内容
  • 下面小编就为大家分享一篇java提取json中某个数组的所有方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 你想不想让Java处理Json像JS那样点点就出来了那就往下看吧!JSONpath github地址json-path/JsonPath​github... 简单说一下各个业务需求上需要那几个API吧查:如果你想寻找某个key的直接使用JsonPath.read(json,...
    你想不想让Java处理Json像JS那样点点就出来了

    那就往下看吧!

    JSONpath github地址

    json-path/JsonPath​github.com
    512232231ac2af1ea193ad4bb9d761f9.png

    使用指南

    引入Maven jar包

    <!--    jsonpath support    -->
            

    简单说一下各个业务需求上需要那几个API吧

    查:如果你想寻找某个key的值

    直接使用

    JsonPath.read(json, "$.store.book[*].author") 号是一个通配符, 代表所有,就是获取到这个json串的store的值里面的book这个数组每一个的author, 书店的每本书的作者列举出来, 返回值不固定,是一个泛型, 你看着合适用哪个,如果你看错了,它会抛出异常来,告诉你该用什么样的来接受

    看下图控制台打印的错误信息,很明了

    2dcbf6e6941cdbaf31f53764032a38a3.png

    改:如果是替换某的Key的值

    //把json进行格式化,然后直接按照json路径,把值重新赋值,格式化字符串返回
    

    增:如果是新塞入数据

    //把json进行格式化,然后直接按照json路径,找到路径,插入key和value,格式化字符串返回
    

    删:如果是删除数据

    //把json进行格式化,然后直接按照json路径,找到路径,删除key和value,格式化字符串返回
    

    进行简单CRUD, 还有强大的工功能,请查看文章开头的github地址

    微信公众号,同步文章,欢迎关注

    249ff90f319eeea6c9e58e7968b3b125.png

    5822629c7049828e19863fa6e1237ba7.png
    展开全文
  • 在很多情况下我们在进行接口测试的时候都会有获取上个接口返回的json数据某个key,然后下个接口调用这个key。今天给大家讲解一下针对不同类型的json获取某个key的。一、首先是单纯object格式key值获取获取...

    在很多情况下我们在进行接口测试的时候都会有获取上个接口返回的json数据中的某个key值,然后下个接口调用这个key值。今天给大家讲解一下针对不同类型的json获取某个key的值。

    一、首先是单纯object格式key值获取

    3a0f4deea0428b8663a90031a4a2237f.png

    获取图中的token的值,首先这是一个响应值,也就是response,再接着他是json,然后是json里面的token,所以定位这个token就是response.json.token.

    这里定义设置一个环境变量方法,apt.variales.set(),我们在方法里面,设置变量名,和定位变量值。apt.variables.set("iid", response.json.token);

    7270d306937d8521f65e2ca5d3d584b7.png

    这些定义好之后我们直接引用变量名就可以了。引用方法{{变量名}}

    746f7674cdc5c2729f7950d75835df4d.png

    二、value格式object和array组合获取json值

    934e72397cf2b1516ba365b45b144873.png

    还是先object格式获取key值的思路,它是一个响应值response,json格式里面的一个值,但是这个值现在数组里面,数组获取值的方法为数组名值的位置,数组的位置标识从0开始的,所以我们需要的值在1,定位这个值就是response.json.message[1]

    533c73af090dc995979db770485033c8.png

    调用环境参数

    533c73af090dc995979db770485033c8.png

    这就是json中定位值的通用格式了,只要清楚自己想要的值在哪然后层层定位,数组中就按照数组取值方法定位就可以了。

    展开全文
  • JSON解析JSONJSON解析器的基本原理步骤获取token流解析出JSON对象参考文章《Netty 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》...
    • JSON
    • 解析JSON
      • JSON解析器的基本原理
      • 步骤
    • 获取token流
    • 解析出JSON对象
    • 参考文章

    • 《Netty 实现原理与源码解析 —— 精品合集》
    • 《Spring 实现原理与源码解析 —— 精品合集》
    • 《MyBatis 实现原理与源码解析 —— 精品合集》
    • 《Spring MVC 实现原理与源码解析 —— 精品合集》
    • 《Spring Boot 实现原理与源码解析 —— 精品合集》
    • 《数据库实体设计合集》
    • 《Java 面试题 —— 精品合集》
    • 《Java 学习指南 —— 精品合集》

    JSON

    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

    JSON与JS的区别以及和XML的区别具体请参考百度百科

    JSON有两种结构:

    第一种:对象

    “名称/值”对的集合不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
    对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
       {"姓名": "张三", "年龄": "18"}
    

    第二种:数组

    值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
    数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
    值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
       [
        {
        "姓名": "张三",
        "年龄":"18"
        },
    
        {
        "姓名": "里斯",
        "年龄":"19"
    
        }
    ]
    

    通过上面的了解可以看出,JSON存在以下几种数据类型(以Java做类比):

    jsonjavastringJava中的StringnumberJava中的Long或Doubletrue/falseJava中的BooleannullJava中的null[array]Java中的List或Object[]{“key”:”value”}Java中的Map

    解析JSON

    JSON解析器的基本原理

    输入一串JSON字符串,输出一个JSON对象。

    步骤

    JSON解析的过程主要分以下两步:

    第一步:对于输入的一串JSON字符串我们需要将其解析成一组token流。

    例如 JSON字符串{“姓名”: “张三”, “年龄”: “18”} 我们需要将它解析成

       {、 姓名、 :、 张三、 ,、 年龄、 :、 18、 }
    

    这样一组token流

    第二步:根据得到的token流将其解析成对应的JSON对象(JSONObject)或者JSON数组(JSONArray)

    下面我们来详细分析下这两个步骤:

    获取token流

    根据JSON格式的定义,token可以分为以下几种类型

    token含义NULLnullNUMBER数字STRING字符串BOOLEANtrue/falseSEP_COLON:SEP_COMMA,BEGIN_OBJECT{END_OBJECT}BEGIN_ARRAY[END_ARRAY]END_DOCUMENT表示JSON数据结束

    根据以上的JSON类型,我们可以将其封装成enum类型的TokenType

       package com.json.demo.tokenizer;
    /**
     BEGIN_OBJECT({)
     END_OBJECT(})
     BEGIN_ARRAY([)
     END_ARRAY(])
     NULL(null)
     NUMBER(数字)
     STRING(字符串)
     BOOLEAN(true/false)
     SEP_COLON(:)
     SEP_COMMA(,)
     END_DOCUMENT(表示JSON文档结束)
     */
    
    public enum TokenType {
        BEGIN_OBJECT(1),
        END_OBJECT(2),
        BEGIN_ARRAY(4),
        END_ARRAY(8),
        NULL(16),
        NUMBER(32),
        STRING(64),
        BOOLEAN(128),
        SEP_COLON(256),
        SEP_COMMA(512),
        END_DOCUMENT(1024);
    
        private int code;    // 每个类型的编号
    
        TokenType(int code) {
            this.code = code;
        }
    
        public int getTokenCode() {
            return code;
        }
    }
    

    在TokenType中我们为每一种类型都赋一个数字,目的是在Parser做一些优化操作(通过位运算来判断是否是期望出现的类型)

    在进行第一步之前JSON串对计算机来说只是一串没有意义的字符而已。第一步的作用就是把这些无意义的字符串变成一个一个的token,上面我们已经为每一种token定义了相应的类型和值。所以计算机能够区分不同的token,并能以token为单位解读JSON数据。

    下面我们封装一个token类来存储每一个token对应的值

       package com.json.demo.tokenizer;
    
    /**
     * 存储对应类型的字面量
     */
    
    public class Token {
        private TokenType tokenType;
        private String value;
    
        public Token(TokenType tokenType, String value) {
            this.tokenType = tokenType;
            this.value = value;
        }
    
        public TokenType getTokenType() {
            return tokenType;
        }
    
        public void setTokenType(TokenType tokenType) {
            this.tokenType = tokenType;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        @Override
        public String toString() {
            return "Token{" +
                    "tokenType=" + tokenType +
                    ", value='" + value + ''' +
                    '}';
        }
    }
    

    在解析的过程中我们通过字符流来不断的读取字符,并且需要经常根据相应的字符来判断状态的跳转。所以我们需要自己封装一个ReaderChar类,以便我们更好的操作字符流。

       package com.json.demo.tokenizer;
    
    import java.io.IOException;
    import java.io.Reader;
    
    public class ReaderChar {
        private static final int BUFFER_SIZE = 1024;
        private Reader reader;
        private char[] buffer;
        private int index;      // 下标
        private int size;
    
        public ReaderChar(Reader reader) {
            this.reader = reader;
            buffer = new char[BUFFER_SIZE];
        }
    
        /**
         * 返回 pos 下标处的字符,并返回
         * @return
         */
        public char peek() {
            if (index - 1 >= size) {
                return (char) -1;
            }
    
            return buffer[Math.max(0, index - 1)];
        }
    
        /**
         * 返回 pos 下标处的字符,并将 pos + 1,最后返回字符
         * @return
         * @throws IOException
         */
        public char next() throws IOException {
            if (!hasMore()) {
                return (char) -1;
            }
    
            return buffer[index++];
        }
    
        /**
         * 下标回退
         */
        public void back() {
            index = Math.max(0, --index);
        }
    
        /**
         * 判断流是否结束
         */
        public boolean hasMore() throws IOException {
            if (index < size) {
                return true;
            }
    
            fillBuffer();
            return index < size;
        }
    
        /**
         * 填充buffer数组
         * @throws IOException
         */
        void fillBuffer() throws IOException {
            int n = reader.read(buffer);
            if (n == -1) {
                return;
            }
    
            index = 0;
            size = n;
        }
    }
    

    另外我们还需要一个TokenList来存储解析出来的token流

       package com.json.demo.tokenizer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 存储词法解析所得的token流
     */
    public class TokenList {
        private List<Token> tokens = new ArrayList<Token>();
        private int index = 0;
    
        public void add(Token token) {
            tokens.add(token);
        }
    
        public Token peek() {
            return index < tokens.size() ? tokens.get(index) : null;
        }
    
        public Token peekPrevious() {
            return index - 1 < 0 ? null : tokens.get(index - 2);
        }
    
        public Token next() {
            return tokens.get(index++);
        }
    
        public boolean hasMore() {
            return index < tokens.size();
        }
    
        @Override
        public String toString() {
            return "TokenList{" +
                    "tokens=" + tokens +
                    '}';
        }
    }
    

    JSON解析比其他文本解析要简单的地方在于,我们只需要根据下一个字符就可知道接下来它所期望读取的到的内容是什么样的。如果满足期望了,则返回 Token,否则返回错误。

    为了方便程序出错时更好的debug,程序中自定义了两个exception类来处理错误信息。(具体实现参考exception包)

    下面就是第一步中的重头戏(核心代码):

       public TokenList getTokenStream(ReaderChar readerChar) throws IOException {
            this.readerChar = readerChar;
            tokenList = new TokenList();
    
            // 词法解析,获取token流
            tokenizer();
    
            return tokenList;
        }
    
        /**
         * 将JSON文件解析成token流
         * @throws IOException
         */
        private void tokenizer() throws IOException {
            Token token;
            do {
                token = start();
                tokenList.add(token);
            } while (token.getTokenType() != TokenType.END_DOCUMENT);
        }
    
        /**
         * 解析过程的具体实现方法
         * @return
         * @throws IOException
         * @throws JsonParseException
         */
        private Token start() throws IOException, JsonParseException {
            char ch;
            while (true){   //先读一个字符,若为空白符(ASCII码在[0, 20H]上)则接着读,直到刚读的字符非空白符
                if (!readerChar.hasMore()) {
                    return new Token(TokenType.END_DOCUMENT, null);
                }
    
                ch = readerChar.next();
                if (!isWhiteSpace(ch)) {
                    break;
                }
            }
    
            switch (ch) {
                case '{':
                    return new Token(TokenType.BEGIN_OBJECT, String.valueOf(ch));
                case '}':
                    return new Token(TokenType.END_OBJECT, String.valueOf(ch));
                case '[':
                    return new Token(TokenType.BEGIN_ARRAY, String.valueOf(ch));
                case ']':
                    return new Token(TokenType.END_ARRAY, String.valueOf(ch));
                case ',':
                    return new Token(TokenType.SEP_COMMA, String.valueOf(ch));
                case ':':
                    return new Token(TokenType.SEP_COLON, String.valueOf(ch));
                case 'n':
                    return readNull();
                case 't':
                case 'f':
                    return readBoolean();
                case '"':
                    return readString();
                case '-':
                    return readNumber();
            }
    
            if (isDigit(ch)) {
                return readNumber();
            }
    
            throw new JsonParseException("Illegal character");
        }
    

    在start方法中,我们将每个处理方法都封装成了单独的函数。主要思想就是通过一个死循环不停的读取字符,然后再根据字符的期待值,执行不同的处理函数。

    下面我们详解分析几个处理函数:

       private Token readString() throws IOException {
            StringBuilder sb = new StringBuilder();
            while(true) {
                char ch = readerChar.next();
                if (ch == '') {   // 处理转义字符
                    if (!isEscape()) {
                        throw new JsonParseException("Invalid escape character");
                    }
                    sb.append('');
                    ch = readerChar.peek();
                    sb.append(ch);
                    if (ch == 'u') {   // 处理 Unicode 编码,形如 u4e2d。且只支持 u0000 ~ uFFFF 范围内的编码
                        for (int i = 0; i < 4; i++) {
                            ch = readerChar.next();
                            if (isHex(ch)) {
                                sb.append(ch);
                            } else {
                                throw new JsonParseException("Invalid character");
                            }
                        }
                    }
                } else if (ch == '"') {     // 碰到另一个双引号,则认为字符串解析结束,返回 Token
                    return new Token(TokenType.STRING, sb.toString());
                } else if (ch == 'r' || ch == 'n') {     // 传入的 JSON 字符串不允许换行
                    throw new JsonParseException("Invalid character");
                } else {
                    sb.append(ch);
                }
            }
        }
    

    该方法也是通过一个死循环来读取字符,首先判断的是JSON中的转义字符。

    JSON中允许出现的有以下几种

       "
    
    b
    f
    n
    r
    t
    u four-hex-digits
    /
    

    具体的处理方法封装在了isEscape()方法中,处理Unicode 编码时要特别注意一下u的后面会出现四位十六进制数。当读取到一个双引号或者读取到了非法字符(’r’或’、’n’)循环退出。

    判断数字的时候也要特别小心,注意负数,frac,exp等等情况。

    通过上面的解析,我们可以得到一组token,接下来我们需要以这组token作为输入,解析出相应的JSON对象

    解析出JSON对象

    解析之前我们需要定义出JSON对象(JSONObject)和JSON数组(JSONArray)的实体类。

       package com.json.demo.jsonstyle;
    
    import com.json.demo.exception.JsonTypeException;
    import com.json.demo.util.FormatUtil;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * JSON的对象形式
     * 对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
     */
    public class JsonObject {
        private Map<String, Object> map = new HashMap<String, Object>();
    
        public void put(String key, Object value) {
            map.put(key, value);
        }
    
        public Object get(String key) {
            return map.get(key);
        }
        ...
    
    }
    
    package com.json.demo.jsonstyle;
    
    import com.json.demo.exception.JsonTypeException;
    import com.json.demo.util.FormatUtil;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    /**
     * JSON的数组形式
     * 数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
     */
    public class JsonArray {
        private List list = new ArrayList();
    
        public void add(Object obj) {
            list.add(obj);
        }
    
        public Object get(int index) {
            return list.get(index);
        }
    
        public int size() {
            return list.size();
        }
        ...
    }
    

    之后我们就可以写解析类了,由于代码较长,这里就不展示了。有兴趣的可以去GitHub上下载。实现逻辑比较简单,也易于理解。

    解析类中的parse方法首先根据第一个token的类型选择调用parseJsonObject()或者parseJsonArray(),进而返回JSON对象或者JSON数组。上面的解析方法中利用位运算来判断字符的期待值既提高了程序的执行效率也有助于提高代码的ke’du’xi

    完成之后我们可以写一个测试类来验证下我们的解析器的运行情况。我们可以自己定义一组JSON串也可以通过HttpUtil工具类从网上获取。最后通过FormatUtil类来规范我们输出。

    具体效果如下图所示:

    a6ebf772e42d3778a7c403eae769e1d4.png

    3dcf7d75ac969af6624d19a971d9e9d5.png
    展开全文
  • public class JsonTest { public static void main(String[] args) { // json串(以自己的为准) String str = "{"id":"75","shoppingCartItemList":[{"id":"407","num":"10"}]}"; JSONObject jsonObject = JSONO
  • 下面小编就为大家分享一篇java中获取json的所有key方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Java如何获取JSON数据

    千次阅读 2021-03-06 00:00:03
    场景:在接口自动化场景,下个接口发送的请求参数,依赖上个接口请求结果。需要将获取值作为全局参数引用。import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io...
  • JSON采用完全独立于语言的文本格式,而且很多语言都提供了对json的支持(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这样就使得JSON成为理想的数据交换格式。数据交换格式,是指客户端...
  • Java 正则表达式-获取json某个属性 处理数据的时候,要匹配json数据格式的字符串某个属性的 json数据格式:{"flow_name":"paramName"} 要获取到 flow_name属性的: paramName 要怎么处理呢? 语法:...
  • JAVA获取json中

    万次阅读 多人点赞 2018-10-30 00:59:38
    一段JSON如下所示: {"code":100,"data":{"grdbl":100.0,"bxl":646,"fwl":0,"mytsl":0}} ...获取json值代码如下: String a="{"code":100,"data":{"grdbl":100.0,"bxl":646,"fwl":0,"mytsl":0}}"; ...
  • 如何获取JsonObjectkey的 发布时间:2021-02-09 09:32:28 来源:亿速云 阅读:52 作者:Leah 如何获取JsonObjectkey的?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这...
  • 我们可以使用正则表达式来获取程序的所有Java关键字。关键是正确使用单词边界。例如,给定“ static staticField”,第一个单词应被识别为关键字,而第二个单词则不应被识别为关键字。这是代码:package regex;...
  • <!DOCTYPE html>
  • java获取Json的某一项

    千次阅读 2020-07-21 17:22:14
    JSONObject jsonObject = JSONObject.parseObject(object); String str = jsonObject.getString("msgName"); //括号里面的是key
  • Java如何获取JSON数据 备忘

    千次阅读 2021-10-27 23:40:10
    Java如何获取JSON数据 https://www.cnblogs.com/Shanghai-vame/p/10009333.html //拿到出参数给下个接口入参 JSONObject object = (JSONObject) JSONObject.parse(body); System.out.println(object....
  • public class Test { public static void main(String args[]) { String a = "{\"id\":\"0001\",\"name\":\"小明\",\"age\":18}"; JSONObject jo = JSONObject.parseObject(a); String b = jo.get("name.
  • 测试json字符串:{"access_token":"hkbQl5o_l67dZ7_vJRATKBwTLk9Yj5QyMuOJThAr8Baj0xWf4wxW1p4ym4iTZ3-ptWRRoVtbCNJnyjGLfed_4bB0HiqGP8v-aXOJUUk1tFs","expires_in":7200,"refresh_token":"_or_31yEp8...
  • java获取json数组

    千次阅读 2019-03-29 16:52:22
    所需jar包的maven依赖: <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <class...
  • javajson取出某个字段的

    万次阅读 2018-10-22 15:51:11
    ... public class JsonTest { ... // json串(以自己的为准) String str = "{"id":"75","shoppingCartItemList":[{"id":"407","num
  • 一、使用jmeter发送post请求有两种方式,并不是只能通过消息体传递1.post请求数据为map格式Map 键、...请求的参数添加在Parameters参数表即可2.post请求数据为json格式JSON的规则很简单:对象是一个无序的“K–V...
  • 在数据处理或者自动化测试过程需要对返回的json数据作校验,针对json数据的单个或多个key进行校验,此时就需要获取json或字典任意key的value 数据如下: data = { duringTime: 401, timesPerDay: 10000, ...
  • 获取JSON数组的某个值,判断其是否为空。
  • 下面小编就为大家分享一篇Java遍历json字符串取值的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 第一种方法:String str = "{'array':[{'id':5,'name':'张三'},{'id':6,'name':'李四'}]}";JSONArray jsonArray = null;jsonArray = jsonobj....//获取数组System.out.println(jsonArray.getJSONObject(0).get(...
  • JSONObject是名称/对的无序集合。它的外部形式是用大括号括起来的字符串, 名称和之间...在Java中, 可以使用import org.json.JSONObject导入此类。 JSONObject类型的对象具有许多有用的方法来检索其任何, 例如...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,922
精华内容 33,168
关键字:

java获取json中的某个值

java 订阅