首页 > 编程语言 >jackson 使用jsonNode与objectNode 实现访问json对象, 操作json对象

jackson 使用jsonNode与objectNode 实现访问json对象, 操作json对象

时间:2024-04-10 20:05:29浏览次数:29  
标签:JsonNode jackson ObjectNode 对象 jsonNode json fieldA

前情提要

因为现有项目都用的阿里巴巴的fastjson 做json串的序列化与反序列化, 但是fastJson的漏洞太多了, 经常处理扫描出来的漏洞时, 需要升级版本, 导致出现各种大大小小的bug, 经过考究, 决定使用jackSon 做新项目的序列化与反序列化工作, 那先看一下常用的场景:

将对象转为json串

初始化一个objectMapper
用writeValueAsString 方法将实体转为json串

    public static String ObjToJson(Object obj) {
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.writeValueAsString(obj);
    }

将json串转为指定对象

传个对象引用类型, 这样可以传复杂嵌套的结构, 并结构化出来, 举个栗子

        new TypeReference<List<LinkedHashMap<String, String>>>(){};

把上面这个作为第二位参数传入, 即可获取到结构化后的实体,并且结构是指定的 List<LinkedHashMap<String, String>>

    public static <T> T jsonParseToObj(String content, TypeReference<T> valueTypeRef) {
        return objectMapper.readValue(content, valueTypeRef);
    }

问题

如果我们不是直接拿着json串进行序列化反序列化操作, 而需要对暂存的json对象进行操作,比如增删改json串中节点的数据,那么之用fastJson时, 通过jsonObject 操作json串的操作,就可以非常方便的实现, 比如:

jsonObj.getString("xxx")
jsonObj.put("a", "b");

现在切换成jackson 之后, 按道理应该也有类似JsonObject 的类, 可以进行类型的操作, 简单研究了一下, 就到了今天的主角登场了, JsonNode 以及 ObjectNode, 使用JsonNode 是一个只读的类似JsonObject对象, 可以直接获取指定key的值等操作; ObjectNode 则支持修改内部值,可以用ObjectNode创建自定义的对象.

    /**
     * jsonStr 转 jsonNode 支持类似jsonObject的操作
     * @param jsonString 待转换的json串
     * @return json node
     */
    public static JsonNode jsonToJsonNode(String jsonString) {
        try {
            return objectMapper.readTree(jsonString);
        } catch (Exception e) {
            log.error("json串转ObjectNode失败");
            return null;
        }
    }

用上述方法可以将json串转换为JsonNode, 用下面的方法则可以将jsonNode 转为指定类的对象

    /**
     * jsonNode 转 对象
     * @param node json 节点
     * @param valueTypeRef 参考引用
     * @return 转换后的class
     * @param <T>
     */
    public static <T> T JsonNodeToObject(JsonNode node, TypeReference<T> valueTypeRef) {
        return objectMapper.convertValue(node, valueTypeRef);
    }

那么获取到了一个json串,通过 jsonToJsonNode 转为jsonNode,我需要在指定Key的层,新增一个键值对, 可他又是只读的, 那咋办? 其实很简单, 直接将其强制转换为ObjectNode, 就能对其进行操作了,继续举个栗子

            JsonNode jsonNode = this.jsonToJsonNode(json);
            ((ObjectNode) jsonNode).put("number", 1);

这样就能将其json串最外层的属性上新增一个 "number":1, 如果需要在里面的指定层操作的话,继续往下看:

            JsonNode jsonNode = JsonUtil.jsonToJsonNode(json);
            JsonNode fieldA = jsonNode.get("fieldA");
            ((ObjectNode) fieldA).put("number", 1);
  • 如果需要创建"key": [xxx, xxx] (array) 的属性放进去, 可以用 ObjectNode.putArray("key") 方法 ,传属性名即可
  • 如果要放不透明的java对象,则要用putPOJO方法
  • 其他基础用法可以自行研究
            JsonNode jsonNode = JsonUtil.jsonToJsonNode(json);
            JsonNode fieldA = jsonNode.get("fieldA");
            // 放 int
            ((ObjectNode) fieldA).put("int", 1);
            // 放对象
            ((ObjectNode) fieldA).putPOJO("obj", invoice); 
            // 放array
            ArrayNode arrayNode = ((ObjectNode) fieldA).putArray("array");
            arrayNode.add("1");
            arrayNode.add("2");
            arrayNode.add("3");

可以看到,操作类似jsonObject对象的JsonNode 以及 ObjectNode 比起fastJson 确实复杂了一点, 但为了项目稳定性,还是值得一用的~

refer:
https://blog.csdn.net/ss_Tina/article/details/133633498
https://github.com/FasterXML/jackson-databind/tree/2.14?tab=security-ov-file
https://blog.csdn.net/L990616_ss/article/details/125928762

标签:JsonNode,jackson,ObjectNode,对象,jsonNode,json,fieldA
From: https://www.cnblogs.com/charler/p/18127267

相关文章

  • 认识学习JSON
    JSON:   json是一种轻量级的数据交换格式。   简单来说:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互。   json在js中提供了两种方法:  JSON.parse():将JSON数据转换为对象或数组。  JSON.stringify():将对象或......
  • JS中的JSON(秒懂如何操作JSON)
    目录一、JSON介绍1.概念2.主要特点3.优点 4.使用JSON的原因使用XML使用JSON 二、JSON语法三、JSON使用1.JSON的序列化2.解析(parse)JSON3.序列化(Stringify)JSON四、JSON实例1.用户信息2.本地存储五、JSON应用场景六、总结一、JSON介绍1.概念JSON(JavaS......
  • 5分钟学会Rust语言如何操作JSON
    JSON(JavaScriptObjectNotation)在Web开发中被广泛应用于数据交换。作为一种数据格式,JSON相较于XML来说,更易于阅读和写入,且数据解析性能强。Rust作为一门系统级编程语言,其与JSON的交互操作密切。本文将详细地描述在Rust中如何操作JSON,包括序列化、反序列化、JSON创建等多个......
  • 跨域请求资源-jsonp和cors区别
    JSONP和CORS的区别JSONP的原理:动态创建script标签;JSONP发送的不是Ajax请求不支持Post请求;CORS中文意思是跨域资源共享,需要服务器端进行CORS配置;CORS发送的是真正的Ajax请求CORS支持Ajax的跨域如果要启用CORS跨域资源共享,关键......
  • postman增加jsonpath功能
    postman的test和Pre-requestScript支持JS语言。但是并没有内置jsonPath函数可以使用变量方式,将jsonPath的函数源代码保存到变量中,需要使用的时候,读取变量,执行代码,就可以获得一个jsonpath函数。变量可保存在集合变量,环境变量和全局变量中。第一步,在变量中配置jsonpath变量名和......
  • PostgreSQL 将分组后的字段合并成一个 JSON 对象
    在PostgreSQL数据库中,有时需要将分组后的字段合并成一个JSON对象,并将其保存到一个新的字段中。本文将介绍如何使用PostgreSQL中的json_agg函数来实现这一目标。假设我们有一个销售订单表格,其中包含订单编号、产品名称和销售数量等字段。现在我们需要按照订单编号分组,并将......
  • PostgreSQL中json_build_object的用法
    在PostgreSQL数据库中,有时我们需要将多个字段合并成一个JSON对象,并将其用于保存或传输数据。json_build_object函数可用于将指定的键值对合并为一个JSON对象。该函数的语法如下:sqljson_build_object(keytext,valueany[,...])其中,key是JSON对象中的键名,可以是......
  • Java,MySQL,JDBC,Jackson时区问题
    Java,MySQL,JDBC,Jackson时区问题今天做了一个测试,主要是测试给时区参数设置不同的值,会出现什么样的问题。数据库是UTC时区。JDBC连接是GMT+8。jackson默认是UTC。JVM时区GMT+8。从数据库中查询的时间是正确的的,jackson会将时间缩短8个小时。数据库是UTC时区。JDBC连接是GMT+......
  • jsonpath提取响应结果,token鉴权处理
    importtimeimportuuidimportrequestsimportpprintfromjsonpathimportjsonpathfromtest_image_codeimportImageCodeclassManage:def__init__(self):self.header={"locale":"zh_CN"}self.login_url='......
  • ETL工具-nifi干货系列 第九讲 处理器EvaluateJsonPath,根据JsonPath提取字段
    1、其实这一节课本来按照计划一起学习RouteOnAttribute处理器(相当于java中的ifelse,switchcase控制语句),但是在学习的过程中遇到了一些问题。RouteOnAttribute需要依赖处理器EvaluateJsonPath,所以本节课我们一起来学习下EvaluateJsonPath处理器。如下图所示: 本节课的示例依然......