GsonUtils和字符串

news/2024/6/3 20:16:37 标签: java, Gson, 字符串, StringFormat

文章目录

      • 1、GsonUtils
      • 2、String本身,可以加入日志信息
      • 3、 Json和Map转换
      • 4、Date转为Json字符串
      • 5、Json和List<T>转换
      • 6、 比较两个JSON字符串的不同
      • 7、 字符串填充:生成单据号时填充
      • 8、 String.format()的使用
      • 9、截断字符串
      • 10、split
      • isNotBlank 和 isNotEmpty的区别
      • 11、判断字符串是否为Json字符串格式
      • 12、deep copy
      • 补充:关于msyql的Json格式

GsonUtils_1">1、GsonUtils

java">@UtilityClass
@Slf4j
public class GsonUtils {
    private static final Gson GSON = new Gson();

    public static String toJsonStr(Object object) {
        return GSON.toJson(object);
    }

    public static String toJsonStr(Object obj, Type type) {
        return GSON.toJson(obj, type);
    }

    public static <T> T fromJson(String json, Class<T> classOfT) {
        return GSON.fromJson(json, classOfT);
    }

    public static <T> T fromJson(String json, Type typeOfT) {
        return GSON.fromJson(json, typeOfT);
    }

    public static String toJson(Object object) {
        try {
            return GSON.toJson(object);
        } catch (Exception e) {
            log.error("序列化失败", e);
        }
        return StringUtils.EMPTY;
    }
}
  • 工具类使用
java">String str = "{\"status\":{\"code\":0,\"__isset_bit_vector\":[1]},\"poiId\":1}";
 TResponse tResponseA = GsonUtils.fromJson(str, TResponse.class);

2、String本身,可以加入日志信息

java">String.format("Duplicate asyncCreateTask request with requestId=%s, billNo=%s, finish it fast.", request.getRequestId(), request.getNo());

3、 Json和Map转换

map.put("0915", "1");
map.put("0916", "2");
String jsonStr = GsonUtils.toJsonStr(map);
Map<String,String> json2Map = GsonUtils.fromJson(jsonStr,new TypeToken<HashMap<String,String>>(){}.getType());

4、Date转为Json字符串

如果类中有Date类型的属性字段,则需要在创建gson的时候设置一下日期格式
    Gson gson = new GsonBuilder()
        .setDateFormat("yyyy-MM-dd")
        .create();
    System.out.println(gson.toJson(new Date()));

5、Json和List转换

java">List<SkuDTO> list = GsonUtils.fromJson(jsonStr,new TypeToken<List<SkuDTO>>(){}.getType());

List<Long> list2 = GsonUtils.fromJson(Lists.newArrayList(1L,2L), new TypeToken<List<Long>>() {}.getType());

6、 比较两个JSON字符串的不同

java">public void t() throws JSONException {
        String s1 = "{\"skuId\":1,\"skuName\":\"test\",\"temp\":2,\"address\":\"bj\"}";
        String s2 = "{\"skuId\":1,\"skuName\":\"test\",\"temp\":3,\"author\":\"mjp\"}";

        // 方式一:
        JSONCompareResult result  = JSONCompare.compareJSON(s1, s2, JSONCompareMode.STRICT);
          <dependency>
            <groupId>org.skyscreamer</groupId>
            <artifactId>jsonassert</artifactId>
            <version>1.5.1</version>
            <scope>test</scope>
        </dependency>

        // 1中有2中没有
        System.out.println(result.isMissingOnField());
        List<FieldComparisonFailure> fieldMissing = result.getFieldMissing();
        for (FieldComparisonFailure fieldComparisonFailure : fieldMissing) {
            System.out.println(fieldComparisonFailure.getExpected());//address
        }

        // 2中有1中没有
        System.out.println(result.isUnexpectedOnField());
        List<FieldComparisonFailure> fieldUnexpected = result.getFieldUnexpected();
        for (FieldComparisonFailure fieldComparisonFailure : fieldUnexpected) {
            System.out.println(fieldComparisonFailure.getActual());//author
        }

        // 1中2中都有,但是val值不一样
        System.out.println(result.isFailureOnField());
        List<FieldComparisonFailure> list = result.getFieldFailures();
        for (FieldComparisonFailure fieldComparisonFailure : list) {
            System.out.println(fieldComparisonFailure.getField());//temp
            System.out.println(fieldComparisonFailure.getActual());//3
            System.out.println(fieldComparisonFailure.getExpected());//2
        }


        // 方式二:
        HashMap<String, Object> diffMap = Maps.newHashMap();
        Gson gson = new Gson();
        Map<String,Object> json1Map = gson.fromJson(s1,new TypeToken<HashMap<String,Object>>(){}.getType());
        Map<String,Object> json2Map = gson.fromJson(s2,new TypeToken<HashMap<String,Object>>(){}.getType());

        for (Map.Entry<String, Object> entry : json1Map.entrySet()) {
            String k1 = entry.getKey();
            Object v1 = entry.getValue();
            Object v2 = json2Map.get(k1);
            // 1中有2中没有
            if (v2 == null) {
                diffMap.put(k1, v1);
                continue;
            }

            // 1中2中都有,但是不一样
            if (!Objects.equals(v1, v2)){
                diffMap.put(k1, "expect:" + v1 + ", actual:" + v2);
            }
        }
        json2Map.forEach((k2, v2) -> {
            Object v1 = json1Map.get(k2);
            // 2中有1中没有
            if (v1 == null) {
                diffMap.put(k2, v2);
            }
        });

        System.out.println(diffMap);//{temp=expect:2.0, actual:3.0, address=bj, author=mjp}
    }

7、 字符串填充:生成单据号时填充

java">Long billType = 1L;
System.out.println("a" + StringUtils.leftPad(billType + "", 5, "0"));// a00001
即在billType的左侧补0,直到00001形成5位为止
右侧填充和两侧填充api如下:
public static String leftPad(final String str, final int size, String padStr)
 public static String center(String str, final int size, String padStr)

8、 String.format()的使用

参考:https://blog.csdn.net/lonely_fireworks/article/details/7962171

  • 简单使用
java">int time = 3;
String nameParis = String.format("达到了最大次数%s次", time);
  • 复杂使用
java">String contentFormat = "您今天售卖的【%s】支商品有较高可能发生售罄,预估销售损失pcs【%s】件,预估销售损失额【%s" +"】元,需联系补货,请点击“[及时处理|%s]”查看详情。";

String url = "sell.out.warning.link:https://xxx.xxx.xxx" + ".com?warnType=%s&categoryId=%s"

String result = String.format(contentFormat, skuCount, salePcs.stripTrailingZeros().toPlainString(),
                saleGmv.stripTrailingZeros().toPlainString(),
                String.format(url, warnType, categoryId));

1、将warnTpe和categoryId,填充到url中,成为一个完整的连接url

2、sku数,pcs,GMV,及时处理链接url 四个字端值,填充到contentFormat的%s中

9、截断字符串

java">String s = "大家好才是真的好";
String truncate = StringUtils.truncate(s, 2, 4);
System.out.println(truncate);//好才是真

10、split

https://www.runoob.com/java/java-string-split.html

isNotBlank 和 isNotEmpty的区别

java">public static boolean isNotEmpty(String str):判断某字符串是否非空,这里不能排除空格字符,即StringUtils.isNotEmpty("  ") = true
  下面是示例:
StringUtils.isNotEmpty(null) = false
StringUtils.isNotEmpty("") = false
StringUtils.isNotEmpty(" ") = true

  
public static boolean isNotBlank(String str)
判断某字符串是否不为空且长度不为0且不由空白符(whitespace)构成,即StringUtils.isNotBlank("  ") = false
 下面是示例:
StringUtils.isNotBlank(null) = false
StringUtils.isNotBlank("") = false
StringUtils.isNotBlank(" ") = false
 
所以,在某些业务场景,用isNotBlank 比 isNotEmpty要好

11、判断字符串是否为Json字符串格式

java">try {
     JsonElement parse = new JsonParser().parse(extra);
      if (parse.isJsonObject() || parse.isJsonArray()) {
                //YES
       }
} catch (JsonSyntaxException e) {
            //ignore
}
// NO

12、deep copy

java">        // 对象deep copy
        MyUser myUser = new MyUser();
        myUser.setSkuId(1L);

        Gson gson = new Gson();
        MyUser newUser = gson.fromJson(gson.toJson(myUser), MyUser.class);
        System.out.println(newUser);
        myUser.setSkuId(77777777777L);
        System.out.println(newUser);

        // 集合deep copy
        List<MyUser> newList = JSON.parseArray(JSON.toJSONString(list), MyUser.class);//fastjson
        System.out.println(newList);
        u1.setSkuId(777777777777777L);
        System.out.println(newList);

补充:关于msyql的Json格式

将json格式的内容存储mysql,mysql中字段为json而非Varchar

  • 推荐5.7之后直接使用 字段名称 json
  • 一般都用varchar(n) 注:n不要太大。太大的话考虑 JSON

http://www.niftyadmin.cn/n/5044375.html

相关文章

nacos 作为注册中心时是强一致性还是最终一致性

答案&#xff1a;强一致性 nacos 有两个一致性的协议&#xff0c;AP、CP 持久性数据、配置数据都是CP强一致性 AP&#xff1a;保障各节点的可用性&#xff0c;不必要求强一致性&#xff0c;比如心跳数据等 参考&#xff1a; Nacos内核设计之一致性协议(上)-阿里云开发者社…

小米手机打开开发者模式

1、打开设置 2、 3、 4、多次连续点击版本&#xff0c;直到提示打开开发者模式 5、进入手机开发者模式后&#xff0c;点击进入“设置”主页的“更多设置”。 6、接着点击进入“开发者选项”。 7、最后打开“USB调试”选项后&#xff0c;手机就打开了USB调试模式。 8、可以…

深度解析React 18应用性能提升

众所周知,React 18 引入的一个重要特性就是并发功能,从根本上改变了 React 应用程序的渲染方式。本文将带大家一同探讨这些最新功能的具体作用,特别是如何提高应用程序性能。 一、主线程与长任务 当我们在浏览器中运行 JavaScript 时,JS 引擎会在单线程环境下执行代码内容…

mybatis-plus的多数据源sql拦截动态表名

问题描述 1、我们使用的是mybatis-plus的多数据源链接&#xff0c;之前使用的mybatis-plus版本是3.3.1&#xff08;版本低了&#xff0c;用不了&#xff09; 2、在网上找的诸多的sql拦截代码&#xff0c;发现断点进不去&#xff0c;找原因后发现由于配置的多个数据源&#xff…

【方案】浅析利用AI智能识别与视频监控技术打造智慧水产养殖监管系统

一、方案背景 针对目前水产养殖集约、高产、高效、生态、安全的发展需求&#xff0c;基于智能传感、智慧物联网、人工智能、视频监控等技术打造智慧水产系统&#xff0c;成为当前行业的发展趋势。传统的人工观察水产养殖方式较为单一&#xff0c;难以及时发现人员非法入侵、偷…

css花字效果

<div data-subtitle"春江潮水连海平" class"colorText">春江潮水连海平</div>.colorText{font-family:ZhanKuKuaiLeTi2016XiuDingBan;font-size: 50px;font-weight: bold;position: relative;background-image: linear-gradient(90deg,#A1B3FB…

uniapp获取一周日期和星期

UniApp可以使用JavaScript中的Date对象来获取当前日期和星期几。以下是一个示例代码&#xff0c;可以获取当前日期和星期几&#xff0c;并输出在一周内的每天早上和晚上&#xff1a; // 获取当前日期和星期 let date new Date(); let weekdays ["Sunday", "M…

EasyWindow - Android 悬浮窗框架

官网 https://github.com/getActivity/EasyWindow 项目介绍 本框架意在解决一些极端需求&#xff0c;如果是普通的 Toast 封装推荐使用 Toaster 集成步骤 如果你的项目 Gradle 配置是在 7.0 以下&#xff0c;需要在 build.gradle 文件中加入 allprojects {repositories {/…