JAVA复杂对象与JSON的转换

1.背景

JSON可以用文本格式存储对象,比如前后端交互过程中传输DTO。现在我的需求是接收到的DTO中除了常见属性外,还有较复杂的List,甚至有多层List嵌套。这个字段除了save和retrieve外不做修改,也不会作为查询时的条件,所以为了方便起见,将整个list作为一个json存入数据库,MySQL5.7开始支持这一类型的栏位

2.工具

我使用的是阿里巴巴的fastjson作为JSON转换的工具

3.代码

3.1Entity

PersonEntity

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PersonEntity {
    private String name;
    private String age;
    private String works;
}

Person实体有姓名和年龄这两个常用属性,和works这个属性

3.2DTO

PersonDTO

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PersonDTO {
    private String name;
    @NotBlank
    private String age;
    @Valid
    @NotEmpty
    @JsonProperty("works")
    private List<WorkDTO> works;
}

PersonDTO中works为List,且类型为WorkDTO

WorkDTO

@Data
@NoArgsConstructor
@AllArgsConstructor
public class WorkDTO {
    @NotNull
    private String place;
    @Valid
    @NotEmpty
    @JsonProperty("activities")
    private List<ActivityDTO> activities;
}

WorkDTO中activity也是list

ActivityDTO

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ActivityDTO {
    public static final ActivityDTO NULL = new ActivityDTO("", 0);

    @NotNull
    private String alias;
    private Integer duration;
}

3.3准备数据

@Test
    void contextLoads() {
        PersonDTO personDTO = new PersonDTO();
        ArrayList<WorkDTO> workDTOS = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            WorkDTO workDTO = new WorkDTO();
            ArrayList<ActivityDTO> activityDTOS = new ArrayList<>();
            for (int j = 0; j < 3; j++) {
                ActivityDTO activityDTO = new ActivityDTO();
                activityDTO.setAlias("action:" + j);
                activityDTO.setDuration(j);
                activityDTOS.add(activityDTO);
            }
            workDTO.setPlace("place:" + i);
            workDTO.setActivities(activityDTOS);
            workDTOS.add(workDTO);
        }
        personDTO.setWorks(workDTOS);
        personDTO.setName("skye");
        personDTO.setAge("20");

        System.out.println("-----------------------------------------------------------------------------------------------------------");
        System.out.println("最初的personDTO:" + personDTO);
        System.out.println("最初的personDTO的works,应当为List<>:" + personDTO.getWorks());

        PersonEntity personEntity = personDTOToEntity(personDTO);
        System.out.println("-----------------------------------------------------------------------------------------------------------");
        System.out.println("personDTO转化为personEntity:" + personEntity);
        System.out.println("personDTO转化为personEntity的works,应当为String:" + personEntity.getWorks());

        PersonDTO personDTO1 = personEntityToDTO(personEntity);
        System.out.println("-----------------------------------------------------------------------------------------------------------");
        System.out.println("personEntity转化为personDTO1:" + personDTO1);
        System.out.println("personEntity转化为personDTO1的works,应当为List<>:" + personDTO1.getWorks());
    }

3.4转换方法

DTO TO ENTITY

    private PersonEntity personDTOToEntity(PersonDTO personDTO) {
        PersonEntity personEntity = new PersonEntity();
        personEntity.setName(personDTO.getName());
        personEntity.setAge(personDTO.getAge());
        //personEntity.setWorks(String.valueOf(personDTO.getWorks()));
        personEntity.setWorks(JSONArray.toJSONString(personDTO.getWorks()));
        return personEntity;
    }

将List转化为String的过程中不可以使用String.valueof,这个方法转化出来的String不是JSON格式

ENTITY TO DTO

    private PersonDTO personEntityToDTO(PersonEntity personEntity) {
        PersonDTO personDTO = new PersonDTO();
        personDTO.setName(personEntity.getName());
        personDTO.setAge(personEntity.getAge());
        List<WorkDTO> workDTOS = JSONArray.parseArray(personEntity.getWorks(),WorkDTO.class);
        personDTO.setWorks(workDTOS);
       return personDTO;
    }

JSONObject可以直接将JSON转化为List

4.结果

-----------------------------------------------------------------------------------------------------------
最初的personDTO:PersonDTO(name=skye, age=20, works=[WorkDTO(place=place:0, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:1, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:2, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:3, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:4, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)])])
最初的personDTO的works,应当为List<>:[WorkDTO(place=place:0, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:1, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:2, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:3, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:4, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)])]
-----------------------------------------------------------------------------------------------------------
personDTO转化为personEntity:PersonEntity(name=skye, age=20, works=[{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:0"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:1"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:2"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:3"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:4"}])
personDTO转化为personEntity的works,应当为String:[{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:0"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:1"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:2"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:3"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:4"}]
-----------------------------------------------------------------------------------------------------------
personEntity转化为personDTO1:PersonDTO(name=skye, age=20, works=[WorkDTO(place=place:0, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:1, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:2, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:3, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:4, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)])])
personEntity转化为personDTO1的works,应当为List<>:[WorkDTO(place=place:0, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:1, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:2, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:3, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:4, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)])]

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
随着互联网的发展,JSON已经成为数据交换的标准格式。然而在实际开发中,我们经常面临着将复杂JSON转换对象的问题。这种转换通常需要处理嵌套的JSON对象JSON数组和多级嵌套等复杂情况。而对于使用Java语言的开发者来说,JavaJSON的支持并不如其他语言那样友好,那么如何将复杂JSON转换Java对象呢? 第一种方法是手动解析。通过使用一些工具类和库,可以将JSON解析成Java对象。手动解析的好处是可以根据需要将JSON的属性映射到相应的Java属性,灵活性较高。但是这种方法需要编写很多冗余的代码,而且容易出错。 第二种方法是使用第三方库。目前比较流行的JSON转换库有Gson、Jackson等。这些库可以自动将JSON解析成Java对象。但是当JSON结构过于复杂时,这种方法可能会遇到一些问题,比如自动转换出错、性能问题等。 第三种方法是使用封装对象。这种方法通常在面对复杂JSON结构时比较有效。通过封装对象,我们可以将JSON中的深层次嵌套转换Java对象的嵌套。这种方法需要编写一些额外的封装类,但是可以保证转换的准确性和可维护性。 无论使用哪种方法,将复杂JSON转换Java对象都需要耗费一定的时间和精力。开发者应该根据实际需求选择最合适的方法。同时,在使用第三方库时也要注意版本的兼容性和性能问题,以确保程序的正确性和高效性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

skye111321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值