jackson 使用Java记录将复杂/嵌套对象序列化(反序列化)为JSON

v2g6jxz6  于 2022-11-08  发布在  Java
关注(0)|答案(1)|浏览(233)

给定以下JSON...

{
  "loginData": {
    "username": "foobar",
    "password": "secret"
  },
  "personalData": {
    "givenName": "Foo",
    "familyName": "Bar"
  }
}

这是我的POJO(可能有一些冗长的Lombok注解)的样子。它被Jackson序列化(去序列化)了:

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private LoginData loginData;
    private PersonalData personalData;

    @Builder
    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    public static class LoginData {
        private String username;
        private String password;
    }

    @Builder
    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    public static class PersonalData {
        private String givenName;
        private String familyName;
    }
}

我想知道是否有可能使用相对较新的Java record概念来复制此结构。

public record LoginData(String username, String password) {}

但是,记录是否也可以用于嵌套/复杂对象,这些对象将通过Jackson转换为JSON?

waxmsbnn

waxmsbnn1#

根据我的理解,您可以使用类似于普通对象/类的记录。这也意味着您可以使用记录作为其他记录的参数。我创建了一个简单的示例,用于将输入JSON字符串转换为包含记录的嵌套对象:
界面定义三条记录:

public interface IRecord {
    record LoginData(String username, String password) {};
    record PersonalData(String givenName, String familyName) {};
    record Data(LoginData loginData, PersonalData personalData) {};
}

要测试的主类:

public class Main {

    public static void main(String[] args) throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();
        String jsonInString = "{\"loginData\": {\"username\": \"foobar\",\"password\": \"secret\"}, \"personalData\": {\"givenName\": \"Foo\", \"familyName\": \"Bar\"}}";

        IRecord.Data user = mapper.readValue(jsonInString, IRecord.Data.class);
        System.out.println(user.loginData().username());
    }
}

输出量:

foobar

相关问题