V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
aispring
V2EX  ›  程序员

探讨一个 Jackson 反序列化的问题

  •  
  •   aispring · 14 天前 · 1355 次点击

    能否将如下 json 在反序列化时去掉中间的子属性得到期望的对象结果??

    {
        "name": "John",
        "address": {
            "street": "123 Main St",
            "city": "Anytown"
        }
    }
    

    期望对象

    @Data
    public class Address {
    
        private String name;
    
        private String street;
        
        private String city;
    }
    
    11 条回复    2025-05-23 18:34:47 +08:00
    shubiao
        1
    shubiao  
       14 天前
    这题我会
    有个注解, 这样写, 具体忘了, 你问下 gpt 就行

    @xxxx(address.street)
    private String street;
    shubiao
        2
    shubiao  
       14 天前
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.databind.ObjectMapper;

    public class Main {
    public static void main(String[] args) throws Exception {
    String json = "{ \"name\": \"John\", \"address\": { \"street\": \"123 Main St\", \"city\": \"Anytown\" } }";

    ObjectMapper mapper = new ObjectMapper();
    Person person = mapper.readValue(json, Person.class);

    System.out.println(person.getName());
    System.out.println(person.getStreet());
    System.out.println(person.getCity());
    }
    }

    class Person {
    private String name;

    @JsonProperty("address.street")
    private String street;

    @JsonProperty("address.city")
    private String city;

    // Getters and setters
    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public String getStreet() {
    return street;
    }

    public void setStreet(String street) {
    this.street = street;
    }

    public String getCity() {
    return city;
    }

    public void setCity(String city) {
    this.city = city;
    }
    }
    EdisonEdz
        3
    EdisonEdz  
       14 天前
    1.需要使用 @JsonDeserialize 字节定义一个反序列化方法
    2.使用 @JsonSetter
    Rickkkkkkk
        4
    Rickkkkkkk  
       14 天前   ❤️ 4
    手动转换是最好的方案,你用一个中间结构体去接,然后把这个中间结构体转换成你期望的对象

    你用一些“奇技淫巧”做到看起来方便的方案都是为后续的迭代挖坑,包括看不明白、不知道怎么支持新字段等等
    zhwguest
        5
    zhwguest  
       14 天前
    咱们至少要说清楚用哪个库来序列化吧,有的库是运行期反射,有的库是插件注解。差异可大了。
    aispring
        6
    aispring  
    OP
       14 天前
    @shubiao 不行,没成功
    aispring
        7
    aispring  
    OP
       14 天前   ❤️ 1
    @zhwguest 标题里的 Jackson ,Java 的一个库
    Hayson
        8
    Hayson  
       14 天前
    aispring
        9
    aispring  
    OP
       14 天前
    @Hayson 功能不一样
    zhwguest
        10
    zhwguest  
       14 天前
    @aispring 抱歉啊,我对这个库不了解,所以还以为就是通常意义上的 json 类型呢,再次抱歉哈
    spritecn
        11
    spritecn  
       14 天前
    @Rickkkkkkk 赞同,怎么直接怎么来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2824 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:02 · PVG 15:02 · LAX 00:02 · JFK 03:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.