首页 > 其他分享 >toString转化成Json或实体对象

toString转化成Json或实体对象

时间:2022-12-08 16:45:40浏览次数:64  
标签:return 转化成 token value Json toString static StringUtils

废话不多说,代码上一波!!!

 实体中生成的toSting转json格式或者转实体类格式

package com.xxx.util;
import com.alibaba.fastjson.JSON;
import javafx.util.Pair;
import org.apache.commons.lang3.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;

import static com.xxx.util.ToStringUtils.ToStringTokenUtils.parseToken;
import static com.xxx.util.ToStringUtils.ToStringTokenUtils.splitToken;


public class ToStringUtils {

    /**
     * 数字类型匹配(包括整形和浮点型) & 日期类型匹配 & 对象类型匹配 & ...
     */
    public static Pattern datePattern = Pattern.compile("^[a-zA-Z]{3} [a-zA-Z]{3} [0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} CST ((19|20)\\d{2})$");
    public static Pattern numPattern = Pattern.compile("^-?[0-9]+\\.?[0-9]*$");
    public static Pattern objectPattern = Pattern.compile("^[a-zA-Z0-9\\.]+\\(.+\\)$");
    public static Pattern listPattern = Pattern.compile("^\\[.*\\]$");
    public static Pattern mapPattern = Pattern.compile("^\\{.*\\}$");
    public static Pattern supperPattern = Pattern.compile("^super=[a-zA-Z0-9\\.]+\\(.+\\)$");
    public static final String NULL = "null";

    /**
     * toString -> json
     */
    public static String toJSONString(String toString) throws ParseException {
        return JSON.toJSONString(toMap(toString));
    }

    /**
     * toString -> object
     */
    public static <T> T toObject(String toString, Class<T> clazz) throws ParseException {
        return JSON.parseObject(toJSONString(toString), clazz);
    }

    /**
     * toString -> map
     */
    private static Map<String, Object> toMap(String toString) throws ParseException {
        if (StringUtils.isEmpty(toString = StringUtils.trim(toString))) {
            return toString == null ? null : new HashMap<>();
        }

        // 移除最外层"()"
        toString = StringUtils.substringAfter(toString, "(").trim();
        toString = StringUtils.substringBeforeLast(toString, ")").trim();

        String token;
        Map<String, Object> map = new HashMap<>();
        while (StringUtils.isNotEmpty(toString) && StringUtils.isNotEmpty(token = splitToken(toString))) {
            toString = StringUtils.removeStart(StringUtils.removeStart(toString, token).trim(), ",").trim();

            // 如果带"super="(lombok的@ToString(callSuper=true)引入),按照当前层继续处理
            if (supperPattern.matcher(token).matches()) {
                token = token.substring(token.indexOf("(") + 1, token.length() - 1);
                toString = String.format("%s,%s", token, toString);
                continue;
            }

            Pair<String, String> keyValue = parseToken(token);
            map.put(keyValue.getKey(), buildTypeValue(keyValue.getKey(), keyValue.getValue()));
        }
        return map;
    }

    /**
     * 单个token解析
     *
     * @param key 可根据key设置自定义序列化操作
     */
    private static Object buildTypeValue(String key, String value) throws ParseException {
        if (StringUtils.isEmpty(value)) {
            return null;
        } else if (value.equals(NULL)) {
            return null;
        }

        // 日期类型
        if (datePattern.matcher(value).matches()) {
            return new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", new Locale("us")).parse(value).getTime();
        }
        // 数字类型
        if (numPattern.matcher(value).matches()) {
            return value;
        }
        // 集合类型
        if (listPattern.matcher(value).matches()) {
            return buildListValue(value);
        }
        // map类型
        if (mapPattern.matcher(value).matches()) {
            return buildMapValue(value);
        }
        // 对象类型
        if (objectPattern.matcher(value).matches()) {
            return toMap(value);
        }

        // 其他都认为是string类型
        return value;
    }

    /**
     * 集合类型
     */
    private static Object buildListValue(String value) throws ParseException {
        List<Object> result = new ArrayList<>();

        value = value.substring(1, value.length() - 1).trim();
        if (StringUtils.isEmpty(value)) {
            return result;
        }

        String token = null;
        while (StringUtils.isNotBlank(value) && StringUtils.isNotBlank(token = splitToken(value))) {
            result.add(buildTypeValue(null, token));
            value = StringUtils.removeStart(StringUtils.removeStart(value, token).trim(), ",").trim();
        }

        return result;
    }

    /**
     * map类型
     */
    private static Map<Object, Object> buildMapValue(String value) throws ParseException {
        Map<Object, Object> result = new HashMap<>();
        value = value.substring(1, value.length() - 1).trim();
        if (StringUtils.isEmpty(value)) {
            return result;
        }

        String token = null;
        while (StringUtils.isNotEmpty(token = splitToken(value))) {
            Pair<String, String> keyValue = parseToken(token);
            result.put(buildTypeValue(keyValue.getKey(), keyValue.getKey()), buildTypeValue(keyValue.getKey(), keyValue.getValue()));

            value = StringUtils.removeStart(StringUtils.removeStart(value, token).trim(), ",").trim();
        }

        return result;
    }


    /**
     * toString token解析
     */
    public static class ToStringTokenUtils {
        /**
         * 获取第一个token,注意: toString不再包括最外层的()
         */
        private static List<Character> TOKEN_LEFT = Arrays.asList('(', '{', '[');
        private static List<Character> TOKEN_RIGHT = Arrays.asList(')', '}', ']');

        static String splitToken(String toString) {
            if (StringUtils.isBlank(toString)) {
                return toString;
            }

            int index = indexOfSplitToken(toString, ',');
            return toString.substring(0, index);
        }

        /**
         * 从token解析出字段名,及对应属性(确保格式为 name=xxx )
         */
        static Pair<String, String> parseToken(String token) {
            int index = indexOfSplitToken(token, '=');
            return new Pair<>(token.substring(0, index), token.substring(index + 1));
        }

        /**
         * 获取token中split下表
         */
        private static int indexOfSplitToken(String token, char split) {
            Stack<Character> stack = new Stack<>();

            for (int i = 0; i < token.length(); i++) {
                char c = token.charAt(i);
                if (TOKEN_LEFT.contains(c)) {
                    stack.push(c);
                } else if (TOKEN_RIGHT.contains(c)) {
                    if (TOKEN_LEFT.indexOf(stack.peek()) != TOKEN_RIGHT.indexOf(c)) {
                        throw new RuntimeException("splitFirstToken error, stack=" + stack + ", toString=" + token);
                    }

                    stack.pop();
                } else if (c == split && stack.isEmpty()) {
                    return i;
                }
            }

            if (stack.isEmpty()) {
                return token.length();
            }
            throw new RuntimeException("splitFirstToken error, stack=" + stack + ", toString=" + token);
        }
    }

}

 

标签:return,转化成,token,value,Json,toString,static,StringUtils
From: https://www.cnblogs.com/big-keyboard/p/16966507.html

相关文章

  • Notepad++ ,json 、xml 格式化插件安装不了 和 github 网站访问不了 最佳解决方案
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • LocalDateTime去掉T,@JsonFormat有效,JSONField失效
    @ApiModelProperty(value="开机时间")@JSONField(format="yyyy-MM-ddHH:mm:ss")privateLocalDateTimebootTime;返回的结果中间有T"createTime":"2022-07-04T......
  • day34-JSON&Ajax02
    JSON&Ajax021.Ajax基本介绍1.1Ajax是什么AJAX即“AsynchronousJavaScriptAndXML”(异步JavaScript和XML)Ajax是一种浏览器异步发起请求(指定发哪些数据),局部更新页面......
  • JsonIgnoreProperties注解的介绍及使用
    JsonIgnoreProperties注解是Jackson库中的一个注解,用于在序列化和反序列化JSON时忽略一些属性。使用方法:在Java类中的需要忽略的属性上添加@JsonIgnoreProperties注解。例......
  • 谁偷了我的1天,JSON格式化时区问题
    问题从mysql数据库查询出来的时间数据,返回给前端后,如果采用yyyy-MM-ddHH:mm:ss的格式进行时间格式化,会相差8小时。而如果采用yyyy-MM-dd的格式,会相差一天。实体中的create......
  • Ptoto 生成json tag 首字母大小写
    有大概两三年时间没使用proto了,最近公司项目中使用了GRPC,自然而然的再次使用了protobuf,但以前前后端有约,所有jsontag使用驼峰命名规则,这些很多年前的细节,一时间王的干净,特......
  • 使用@RequestPart同时上传表单数据和文件(文件与JSON数据同时上传)
    前端接口上传文件的时候,通常会将请求header的content-type设置为:multipart/form-data,或者form表单提交的时候将enctype设置为"multipart/form-data"。后端收到请求时......
  • POM net.sf.json-lib:json-lib报错问题解决
    在配置项目的Jackson的时候,需要添加依赖<dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><......
  • 【JMETER后置处理器--json提取器】
    一、使用场景json提取器用于提取请求返回结果中的某个值或者某一组值,存储为指定的变量,用于后续的接口调用,使用方法比正则表达式提取器简单,所以如果接口响应数据为json格式的......
  • day33-JSON&Ajax01
    JSON&Ajax01JSON在线文档AJAX在线文档1.JSON介绍JSON指的是JavaScript对象表示法(JavaScriptObjectNotation),JSON的本质仍然是JavaScript对象JSON是轻量......