首页 > 其他分享 >基于jackson的json key压缩工具类

基于jackson的json key压缩工具类

时间:2024-04-16 16:44:32浏览次数:12  
标签:map JsonNode jackson ObjectNode return json static import 压缩工具

package com.zipkey;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.zipkey.bean.Body;

import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class JsonZipKey {

    private static final char[] keyList = new char[52];

    static {
        int total = 0;
        for(int c = 'a'; c <= 'z'; c++){
            keyList[total++] = (char) c;
        }
        for(int c = 'A'; c <= 'Z'; c++){
            keyList[total++] = (char) c;
        }
    }
    /**
     * {
     *     "_": 1,
     *     "map" : {"a":"uid"....},
     *     "id": "1"
     * }
     * @return
     */
    public static <T> ObjectNode getJSONZipMap(Class<T> cl, String id, boolean shortToLong,
                                               boolean justMap) throws Exception {
        JsonNode json = JsonUtil.objToJsonNode(cl.newInstance());
        ObjectNode jsonNode = JsonUtil.createObject();
        Iterator<String> it = json.fieldNames();
        int i = 0;
        while(it.hasNext()) {
            String k = it.next();
            if(shortToLong) {
                jsonNode.put(getZipChar(i++), k);
            } else {
                jsonNode.put(k, getZipChar(i++));
            }
        }
        if(justMap) return jsonNode;
        ObjectNode r = JsonUtil.createObject();
        r.set("map", jsonNode);
        r.put("id", id);
        return r;
    }
    
    public static ObjectNode zip(JsonNode map, JsonNode value) {
        if(map == null) {
            throw new RuntimeException("map is not null!");
        }
        ObjectNode r = JsonUtil.createObject();
        value.fieldNames().forEachRemaining(a -> {
            JsonNode v = value.get(a);
            if(v != null && !v.isNull()) {
                JsonNode field = map.get(a);
                if(field == null) {
                    throw new RuntimeException("map field not find: " + a);
                }
                r.set(field.asText(), v);
            }
        });
        return r;
    }

    private static String getZipChar(int i) {
        if(i < 52) return keyList[i] + "";
        StringBuilder sb = new StringBuilder();
        do {
            sb.append(keyList[i % 52]);
            i = i / 52;
        } while (i > 52);
        sb.append(keyList[i-1]);
        return sb.toString();
    }

    private static class JsonUtil {

        private static ObjectMapper mapper = new ObjectMapper();

        private static Map<String, JsonNode> zipMap = new ConcurrentHashMap<>();

        static {
            mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
            mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);
        }

        public static void putZipMap(String id, JsonNode map) {
            zipMap.put(id, map);
        }

        public static void getZipMap(String id, JsonNode map) {
            zipMap.put(id, map);
        }


        public static JsonNode objToJsonNode(Object obj) throws JsonProcessingException {
            return toJsonNode(toJson(obj));
        }

        public static String toJson(Object obj) throws JsonProcessingException {
            return mapper.writeValueAsString(obj);
        }

        public static JsonNode toJsonNode(String json) throws JsonProcessingException {
            return mapper.readTree(json);
        }

        public static ObjectNode createObject() {
            return  mapper.createObjectNode();
        }
    }



    public static void main(String[] args) throws Exception {
        
        
        
//        Set<String> set = new HashSet<>();
//        int size = 52 * 52 * 52;
//        for(int i = 0;i < size;i++) {
//            set.add(getZipChar(i));
//        }
//        if(set.size() != size) {
//            throw new Exception(size + " error " + set.size());
//        }
        
        
        
//        System.out.println(getJSONZipMap(Body.class, "1", true, false));
//        System.out.println(getJSONZipMap(Body.class, "1", false, true));



        ObjectNode map = getJSONZipMap(Body.class, "1", false, true);
        Body b = new Body();
        b.setJson("{}");
        b.setAti("aa");
        b.setBit(11);
        b.setCity("china");
        b.setDate("2023-01-01");
        ObjectNode r = JsonZipKey.zip(map, JsonUtil.objToJsonNode(b));
        r.put("_", "1");
        System.out.println(r);
    }

}

 

标签:map,JsonNode,jackson,ObjectNode,return,json,static,import,压缩工具
From: https://www.cnblogs.com/math-and-it/p/18138589

相关文章

  • fastjson 1.2.24 反序列化导致任意命令执行漏洞复现
    前置知识今天复现了常见的fastjson反序列化漏洞,了解该漏洞需要一些前置的知识,这里总结一下:Fastjsonfastjson是一个Java的库,可以将Java对象转换为Json字符串,也可以将Json字符串转换为Java对象,Fastjson也可以操作一些Java中的对象。JNDIJNDI(JavaNamingandDirectoryInterf......
  • jsoncpp的基本操作
    基本概念: 2.jsoncpp的使用jsoncpp库中的类被定义到了一个Json命名空间中,建议在使用这个库的时候先声明这个命名空间: usingnamespaceJson;使用jsoncpp库解析json格式的数据,我们只需要掌握三个类:Value类:将json支持的数据类型进行了包装,最终得到一个Value类型FastWrite......
  • protobuf 和 json 互转
    common.h#ifndefCOMMON_H#defineCOMMON_H#include"google/protobuf/message.h"#include"nlohmann/json.hpp"#include"google/protobuf/util/json_util.h"usinggoogle::protobuf::util::MessageToJsonString;usingnamespacego......
  • 如何使用groovy反序列化json
    使用Groovy反序列化JSON可以通过以下步骤实现:导入相关的Groovy库:在Groovy脚本或Groovy项目中,首先需要导入相关的Groovy库,以便使用JSON反序列化的功能。可以使用以下代码导入库:importgroovy.json.JsonSlurper复制创建JsonSlurper对象:JsonSlurper是Groovy提供的一个用于解......
  • 从Google网页中通过正则表达式获取json如何转换unicode对象
    场景:Google爬虫,获取下拉框搜索关键词,需要获取页面的里面的json字符串如下面:'{\\x22aa\\x22:{},\\x22abd\\x22:{\\x22abd\\x22:false,\\x22deb\\x22:false,\\x22det\\x22:false},\\x22async\\x22:{},\\x22attn\\x22:{},\\x22bgd\\x22:{\\x22ac\\x22:true,\\x......
  • Python+FastJson漏洞批量检测实战
    #-*-coding:utf-8-*-importosimportsubprocess#指定要读取文件的目录directory='D:/gongju02/anq/FastJson/JsonExp-1.4.0'defjson_exp(text_path):"""指定要检测的接口文件目录"""try:#改变当前工作目录os.chdir(di......
  • FastJson反序列化漏洞利用和扫描探测工具-实战
    一、简介fastjson漏洞批量检测工具,根据现有payload,检测目标是否存在fastjson或jackson漏洞(工具仅用于检测漏洞),若存在漏洞,可根据对应payload进行后渗透利用,若出现新的漏洞时,可将最新的payload新增至txt中(需修改格式),工具完全替代手工检测,作为辅助工具使用。二、LDAP检测环境搭建......
  • 使用内置函数 (SQL Server) 验证、查询和更改 JSON 数据
    使用内置函数(SQLServer)验证、查询和更改JSON数据项目2023/09/0313个参与者反馈 本文内容此页上的示例JSON文本使用ISJSON函数验证JSON文本使用JSON_VALUE函数从JSON文本中提取值使用JSON_QUERY函数从JSON文本中提取对象或数组显示另外......
  • JSON.parse() 方法中里面有函数,转化完成后是字符串问题
    要将JSON字符串中的函数还原回原来的函数对象,你可以使用JSON.parse()方法,并提供一个reviver函数来将字符串表示的函数重新转换为函数对象。以下是你可以使用的代码示例:varobj={"name":"Runoob","alexa":function(){return10000;},"site":"www.runoob.com"};//......
  • JackSon反序列化通杀
    前言Springboot一般都会自带JackSon这个依赖包,JackSon跟Fastjson有相同的功效简单复现packagecom.example.jakeson.demo;importjava.io.IOException;importjava.io.Serializable;publicclassUserimplementsSerializable{publicUser(){}publicOb......