美文网首页
JSON TypeReference 泛型数据处理

JSON TypeReference 泛型数据处理

作者: Tinyspot | 来源:发表于2024-04-09 19:33 被阅读0次

1. 转换

@Test
public void test() {
    String text = "[ {\"code\":\"R001\",\"date\":1676703926184,\"id\":1001}," +
                    "{\"code\":\"R002\",\"date\":1676703926184,\"id\":1002} ]";

    List<OrderDTO> orders = JSON.parseArray(text, OrderDTO.class);
}

2. 泛型类的实例化

2.1 JSON串 --> ResultDTO<OrderDTO>

@Test
public void test() {
    ResultDTO<OrderDTO> resultDTO = new ResultDTO<>();
    resultDTO.setSuccess(true);
    resultDTO.setData(new OrderDTO(1001L, "R001", new Date()));

    // 打印 json 串: JSON.toJSONString(resultDTO)
    // {"data":{"code":"R001","date":1712648470496,"id":1001},"success":true}

    ResultDTO<OrderDTO> result = JSON.parseObject(JSON.toJSONString(resultDTO), new TypeReference<ResultDTO<OrderDTO>>() {});
    System.out.println(result);
}
@Data
public class ResultDTO<T> {
    private T data;
    private Boolean success;
}

@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderDTO {
    private Long id;
    private String code;
    private Date date;
}

2.2 JSON串 --> ResultDO<List<BaseUserDO>>

@Test
public void joiner() {
   String text = "{\"module\":[null],\"success\":true}";
    ResultDO<List<BaseUserDO>> userInfoResult = JSON.parseObject(text,
            new TypeReference<ResultDO<List<BaseUserDO>>>(){});

    System.out.println(userInfoResult);

    List<BaseUserDO> module = userInfoResult.getModule();
    BaseUserDO baseUserDO = module.get(0);
    // 此时 baseUserDO = null, baseUserDO.getUserId() 会报NPE
    System.out.println(baseUserDO.getUserId());
}

模型

@Data
public class ResultDO<T> implements Serializable {
    private static final long serialVersionUID = 693234701969300224L;

    private Boolean success;
    private String trace;
    private String errorCode;
    private String errorMessage;
    private T module;

    @Override
    public String toString() {
        return "ResultDO{success=" + this.success + ", trace='" + this.trace + "'" + ", module=" + this.module + '}';
    }
}

@Data
public class BaseUserDO implements Serializable {
    private static final long serialVersionUID = 3715835354206806065L;

    protected String id;
    protected Long userId;
    protected String nick;
    protected String email;
    protected String loginId;
    protected Date lastVisit;
}

3. Map 类型

3.1 JSON串 --> Map<String, Object>

@Test
public void test() {
    String text = "{" +
            "    \"001\": {" +
            "        \"id\": 1001," +
            "        \"code\": \"T001\"" +
            "    }," +
            "    \"002\": {" +
            "        \"id\": 1002," +
            "        \"code\": \"T002\"" +
            "    }" +
            "}";

    /*
    * TypeReference 构造方法是 protected,所以使用它的子类 (用匿名内部类作为TypeReference子类)
    * TypeReference<Map<String, OrderDTO>> typeReference = new TypeReference<Map<String, OrderDTO>>() {};
    * 
    * 匿名内部类
    * 语法: new 父类() { 子类内容 };
    */
    Map<String, OrderDTO> result = JSON.parseObject(text, new TypeReference<Map<String, OrderDTO>>() {});

    System.out.println(result);
}

3.2 JSON串 --> Map<String, List<Object>>

@Test
public void test() {
    String text = "{" +
                "    \"2024001\": [" +
                "        {" +
                "            \"id\": 1001," +
                "            \"code\": \"T001\"" +
                "        }" +
                "    ]," +
                "    \"2024002\": [\n" +
                "        {\n" +
                "            \"id\": 1002," +
                "            \"code\": \"T002\"" +
                "        }" +
                "    ]" +
                "}";

    Map<Integer, List<OrderDTO>> map = JSON.parseObject(text, new TypeReference<Map<Integer, List<OrderDTO>>>() {});
    System.out.println(map);
}

相关文章

网友评论

      本文标题:JSON TypeReference 泛型数据处理

      本文链接:https://www.haomeiwen.com/subject/bkwfxjtx.html