首页 > 编程语言 > 详细

Java解析JSON字符串

时间:2021-08-08 11:03:58      阅读:39      评论:0      收藏:0      [点我收藏+]

理解

传入一个JSON字符串,进行处理,本文章提供两种方法进行解析

钻研

  1. JsonNode

  2. JsonObject
    public static final Object parse(String text);    // 把JSON文本parse为JSONObject或者JSONArray
    public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
    public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
    public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
    public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
    public static final Object toJSON(Object javaObject); // 将JavaBean转换为JSONObject或者JSONArray

使用

例如现在有一个字符串:

技术分享图片

  1.  第一种方法
    public OperateResult getJSONTest(@RequestBody() String jsonStr) throws Exception {
            // Json字符串转换成JsonNode对象
            ObjectMapper mapper = new ObjectMapper();
            JsonNode jsonNode = mapper.readTree(jsonStr);
            // jsonNode的fieldNames方法是获取jsonNode的所有的key值
            Iterator<String> keys = jsonNode.fieldNames();
            while(keys.hasNext()){
                String key = keys.next();
                System.out.println("key键是:"+key);
            }
            // 根据key值获取对应的值,三种方法都可以
            JsonNode path = jsonNode.path("companyName");
            JsonNode resultValue = jsonNode.findValue("companyName");
            JsonNode resultPath = jsonNode.findPath("companyName");
    
            // 获取JsonNode数组的每个节点
            Iterator<JsonNode> elements = jsonNode.elements();
            while(elements.hasNext()){
                JsonNode node = elements.next();
                System.out.println(node.toString());
            }
    
            // 取出所有key值为companyName的JsonNode的List
            List<JsonNode> findKeys = jsonNode.findParents("companyName");
            for (JsonNode result:findKeys){
                System.err.println(result.toString());
            }
    
            // 取出所有key值为number对应的value(如果value中包含子jsonNode并且子jsonNode的key值也为number,是无法捕获到并加入list的)
            List<JsonNode> findValues = jsonNode.findValues("companyName");
            for(JsonNode value: findValues){
                System.out.println( value.toString());
            }
    
            // 遍历某个JsonNode的key和value(value可能是字符串也可能是子jsonNode,但如果value是jsonNode数组的话,是无法读取的)
            Iterator<Map.Entry<String,JsonNode>> jsonNodes = jsonNode.fields();
            while (jsonNodes.hasNext()) {
                Map.Entry<String, JsonNode> node = jsonNodes.next();
                System.err.println("遍历获取key:"+node.getKey());
                System.err.println("遍历获取值:"+node.getValue().toString());
            }
    
            // 如果是JDK1.8的话,可以这样遍历JsonNode的子节点
            jsonNode.forEach((JsonNode node)->{
                System.out.println("结果:"+node.toString());
            });
            
            // JsonNode对象转换成JSON字符串
            String json = mapper.writeValueAsString(jsonNode);
            System.out.println("JsonNode--->Json:"+json);
    
            return new OperateResult(true, "解析成功", null);
        }

     

    注意:findValue()方法和findPath()方法都可以根据key获取value,区别在于:findPath()如果没有找到值会返回null,而findValue()如果没有找到值会返回一个缺少节点的无值非空实例。其次,在不保证节点一定会存在的情况下去获取子节点,需要做非空判断,因为如果没有父级节点去获取子节点会抛出空指针异常
    

     

  2.  第二种方法
        public OperateResult getJSONTest(@RequestBody() String jsonStr) throws Exception {
            //json字符串转换成JsonObject对象
            JSONObject object =  JSON.parseObject(jsonStr);
    
            //JsonObject对象转换成JavaBean
            Student student = object.toJavaObject(Student.class);
            //json字符串转换成JavaBean
            Student stu = JSON.parseObject(jsonStr,Student.class);
    
            //JsonObject对象根据key获取对应的值
            String name = object.getString("stuName");
    
            return new OperateResult(true, "解析成功", null);
        }

Java解析JSON字符串

原文:https://www.cnblogs.com/passex/p/15113746.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!