java小工具util系列3:JSON和实体类转换工具

简介: java小工具util系列3:JSON和实体类转换工具

1.jpeg

准备工作

引入pom

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
 </dependency>
AI 代码解读

实体bean

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
   
    private Integer id;
    //姓名
    private String name;
}
AI 代码解读

fastjson

1.JSONObject获取所有的key

技巧:
JSONObject获取key:↓
    JSONObject obj;
    for (Map.Entry<String, Object> entry : cutReceiveAlarmMessageObject.entrySet()) {
   
           String s = entry.getKey();
    }
AI 代码解读

2.集合中实体对象转换 list中Enrey转Dto

list中Enrey转Dto:↓
    List<WarningNoticeDto> warningNoticeDtoList = warningNoticeList.getInfo().getList().stream().map(this::getEntryToDto).collect(Collectors.toList());
    /**
     * entry转DTO
     * @param warningNotice entry
     * @return dto
     */
    private WarningNoticeDto getEntryToDto(WarningNotice warningNotice) {
   
        WarningNoticeDto warningNoticeDto = new WarningNoticeDto();
        BeanUtils.copyProperties(warningNotice, warningNoticeDto);
        return warningNoticeDto;
    }
AI 代码解读

3.字符串转List

import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.JSONObject;

String str = "[
  {
    "id": 5,
    "nodeIdArr": "[\"221\",\"222\"]",
    "nodeNameArr": "[\"enb_221\",\"2222\"]",
    "upperLimitOfTheBusyTimeThreshold": 9,
    "lowerLimitOfTheBusyTimeThreshold": 2,
    "dateRangeBeginTime": 1701648000000,
    "dateRangeEndTime": 1701682200000,
    "createTime": 1701676594000,
    "updateTime": 1701737385000,
    "activeState": "1"
  },
  {
    "id": 6,
    "nodeIdArr": "[\"2003\",\"501\",\"10010\"]",
    "nodeNameArr": "[\"CityA\",\"501\",\"Vir1\"]",
    "upperLimitOfTheBusyTimeThreshold": 9,
    "lowerLimitOfTheBusyTimeThreshold": 2,
    "dateRangeBeginTime": 1701648000000,
    "dateRangeEndTime": 1701682200000,
    "createTime": 1701676641000,
    "updateTime": 1701737382000,
    "activeState": "1"
  }]"
List<BusyTimeIndicatorAlarmThreshold> busyTimeIndicatorAlarmThresholdList = new ArrayList<>();
busyTimeIndicatorAlarmThresholdList = JSONObject.parseObject(str, new TypeReference<List<BusyTimeIndicatorAlarmThreshold>>() {});
AI 代码解读

方式一、List busyTimeIndicatorAlarmThresholdList = new ArrayList<>();
busyTimeIndicatorAlarmThresholdList = JSONObject.parseObject(str, new TypeReference>() {});

方式二、List userList = JSONArray.parseArray(str, User.class);

4.json字符串转JSONObject

@Test
public void jsonStrConverJSONObject(){
   
    String str = "{\"id\":1,\"name\":\"tom\"}";
    JSONObject jsonObject = JSONObject.parseObject(str);
    System.out.println(jsonObject);     
}
AI 代码解读

输出:{"name":"tom","id":1}

5.list根据ids数组过滤list

@Test
public void listFilter() {
   
    List<User> list = new ArrayList<>();
    list.add(new User(1, "a"));
    list.add(new User(2, "b"));
    list.add(new User(3, "c"));
    list.add(new User(4, "d"));
    list.add(new User(5, "e"));
    list.add(new User(6, "f"));
    list.add(new User(7, "g"));
    list.add(new User(8, "h"));
    list.add(new User(9, "i"));
    list.add(new User(10, "j"));

    //注意:数组类型必须使用Integer才可以,使用int会判断失败
    Integer[] arr = new Integer[]{
   1,2,5,6,9};
    List<User> filterList = list.stream().filter(item -> Arrays.asList(arr).contains(item.getId())).collect(Collectors.toList());
    filterList.stream().forEach(System.out::println);
}
AI 代码解读

6.json字符串转JavaBean对象

@Test
public void jsonStrConverBean(){
   
    String str = "{\"id\":1,\"name\":\"tom\"}";
    User user = JSONObject.parseObject(str, User.class);
    System.out.println(user);   
}
AI 代码解读

输出:User(id=1, name=tom)

7.json对象转javabean

@Test
public void JSONObjectConverBean(){
   
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("id", 1);
    jsonObject.put("name", "tom");
    User user = JSONObject.toJavaObject(jsonObject, User.class);
    System.out.println(user);   
}
AI 代码解读

输出:User(id=1, name=tom)

8.jsonObject转map

@Test
public void JSONObjectConverMap(){
   
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("id", 1);
    jsonObject.put("name", "tom");
    Map<String,String> map = JSONObject.parseObject(jsonObject.toJSONString(), Map.class);
    System.out.println(map);   
}
AI 代码解读

输出:{name=tom, id=1}

9.List\转jsonArray

@Test
public void listConverjJsonArray(){
   
    List<User> list = new ArrayList<>();
    list.add(new User(1, "a"));
    list.add(new User(2, "b"));
    //错误写法,因为list.toString()输出[User(id=1, name=a), User(id=2, name=b)]。这东西无法json解析,会报错:com.alibaba.fastjson.JSONException: syntax error, pos 2, line 1, column 3[User(id=1, name=a), User(id=2, name=b)]
    //        JSONArray jsonArray =JSONArray.parseArray(list.toString());
    //正确写法,简写方式
    JSONArray jsonArray =JSONArray.parseArray(JSONObject.toJSONString(list));

    //正确写法,复杂方式
    //        JSONArray jsonArray = new JSONArray();
    //        JSONObject jsonObject = null;
    //        for (User user: list) {
   
    //            jsonObject = new JSONObject();
    //            jsonObject.put("id", user.getId());
    //            jsonObject.put("name", user.getName());
    //            jsonArray.add(jsonObject);
    //        }
    System.out.println(jsonArray);
}
AI 代码解读

10.jsonArray转成String[]

@Test
public void jsonArrayConverStringArray(){
   
    JSONArray jsonArray = new JSONArray();
    jsonArray.add(0, "100");
    jsonArray.add(1, "101");
    jsonArray.add(2, "102");
    System.out.println("jsonArray:" + jsonArray);

    String[] stringArr = new String[jsonArray.size()];
    for (int i = 0; i < jsonArray.size(); i++) {
   
        stringArr[i] = jsonArray.get(i).toString();
    }
    for(String str : stringArr) {
   
        System.out.println(str);
    }
}
AI 代码解读

11.List\转int[]

List<Integer> list = xxxxxxxx;
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
AI 代码解读

12.List集合按照某个属性值又打大小排序

p2-p1降序,p1-p2升序

List<TscRegTop> neListList;
Collections.sort(neListList, new Comparator<TscRegTop>() {
            @Override
            public int compare(TscRegTop p1, TscRegTop p2) {
                return p2.getTscRegMsNums() - p1.getTscRegMsNums();
            }
        });
AI 代码解读

13.对Collections.sort排序后我想制定查询几条,比如list有10条,我只想获取前4条

neListList.subList(0, Math.min(neListList.size(), 条数))
AI 代码解读

14. Java 8 引入的 Optional 类型,它可以用来处理可能为空的值

如果user.getAge()为null那么返回0;如果不为空则返回值。

user.setXXX(Optional.ofNullable(user.getAge()).orElse(0));
AI 代码解读

15.Long类型转Integer

Long number = xxxx;
Integer item = number.intValue();
AI 代码解读

问题:为啥使用int就判断失效,而使用Integer和String都能准确判断?

/**
  * 问题:为啥使用int就判断失效,而使用Integer和String都能准确判断?
  * 答案:不能将基本数据类型转化为List列表。
*/
@Test
public void test1() {
   
    int[] arr = new int[]{
   1,2,5,6,9};
    System.out.println(Arrays.asList(arr).contains(1)); //结果为false
    Integer[] arr2 = new Integer[]{
   1,2,5,6,9};
    System.out.println(Arrays.asList(arr2).contains(1)); //结果为true
    String[] arr3 = new String[]{
   "1","2","5","6","9"};
    System.out.println(Arrays.asList(arr3).contains("1")); //结果为true

    //验证答案如下,把arr、arr2、arr3分别返回查看返回泛型,能够看出Arrays.asList(arr)返回的居然是List<int[]>,问题就出在这,说明list里面包含的是一个个的int[],用这个判断ints.contains(1),肯定为false
    List<int[]> ints = Arrays.asList(arr);
    List<Integer> integers = Arrays.asList(arr2);
    List<String> strings = Arrays.asList(arr3);
}
AI 代码解读

jackjson

16.字符串转List

字符串长这样

{
   
    "returnCode": "2000",
    "data": [
        {
   
            "activityId": "07e71d599d734d3f844c5014a991462b",
            "entId": null,
            "entName": "苏州芯慧和创科技发展有限公司"
        }
    ]
}
AI 代码解读

转换代码

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;
import java.util.List;
import java.util.ArrayList;

public class Main {
   
    public static void main(String[] args) {
   
        String json = "{\"returnCode\":\"2000\",\"data\":[{\"activityId\":\"07e71d599d734d3f844c5014a991462b\",\"entId\":null,\"entName\":\"苏州芯慧和创科技发展有限公司\"}]}";

        try {
   
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode rootNode = objectMapper.readTree(json);
            JsonNode dataArray = rootNode.get("data");

            List<User> userList = new ArrayList<>();
            for (JsonNode node : dataArray) {
   
                User user = objectMapper.treeToValue(node, User.class);
                userList.add(user);
            }

            // 打印输出
            for (User user : userList) {
   
                System.out.println(user);
            }
        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }
}
AI 代码解读

本人其他文章链接

1.java小工具util系列1:日期毫秒数转日期字符串
https://blog.csdn.net/a924382407/article/details/121955349

2.java小工具util系列2:获取字符modelStr在字符串str中第count次出现时的下标
https://blog.csdn.net/a924382407/article/details/121955455

3.java小工具util系列3:正则表达式匹配:匹配不包含@特殊字符的字符串
https://blog.csdn.net/a924382407/article/details/121955737

4.java小工具util系列4:String[] 转 List< Integer >
https://blog.csdn.net/a924382407/article/details/121956201

5.java小工具util系列5:基础工具代码(Msg、PageResult、Response、常量、枚举)
https://blog.csdn.net/a924382407/article/details/120952865

6.java小工具util系列6:java执行string返回boolean结果
https://blog.csdn.net/a924382407/article/details/117124536

7.java小工具util系列7:集合中实体对象转换 list中Enrey转Dto
https://blog.csdn.net/a924382407/article/details/121957545

8.java小工具util系列8:JSONObject获取key
https://blog.csdn.net/a924382407/article/details/121957607

9.java小工具util系列9:检测一个字符串是否是时间格式
https://blog.csdn.net/a924382407/article/details/123948881

10.java小工具util系列10:时间毫秒数、时间格式字符串、日期之间相互转化
https://blog.csdn.net/a924382407/article/details/124581851

目录
打赏
0
2
2
0
233
分享
相关文章
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
284 4
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本项目提供了一套基于Java的图片处理教学方案,包含自定义图片生成、图像水印添加及合法电子凭证生成技术示例。
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本内容提供Java生成自定义图片的示例代码,涵盖基础图像创建、文本添加及保存功能,适合学习2D图形编程。包括教学示例图片生成、文本图层处理和数字水印技术实现方案。
JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
452 1
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
122 0
|
14天前
|
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
57 0
Java 无锁方式实现高性能线程实战操作指南
本文深入探讨了现代高并发Java应用中单例模式的实现方式,分析了传统单例(如DCL)的局限性,并提出了多种无锁实现方案。包括基于ThreadLocal的延迟初始化、VarHandle原子操作、Record不可变对象、响应式编程(Reactor)以及CDI依赖注入等实现方式。每种方案均附有代码示例及适用场景,同时通过JMH性能测试对比各实现的优劣。最后,结合实际案例设计了一个高性能配置中心,展示了无锁单例在实际开发中的应用。总结中提出根据场景选择合适的实现方式,并遵循现代单例设计原则以优化性能和安全性。文中还提供了代码获取链接,便于读者实践与学习。
52 0
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
154 83
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
165 83
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问