繁体   English   中英

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

[英]Using Java records for (de-)serializing complex/nested objects to JSON

鉴于以下 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?

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

定义三个记录的接口:

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

主要class来测试:

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());
    }
}

Output:

foobar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM