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

2025 年 5 月 23 日
 aispring

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

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

期望对象

@Data
public class Address {

    private String name;

    private String street;
    
    private String city;
}
2071 次点击
所在节点    程序员
11 条回复
shubiao
2025 年 5 月 23 日
这题我会
有个注解, 这样写, 具体忘了, 你问下 gpt 就行

@xxxx(address.street)
private String street;
shubiao
2025 年 5 月 23 日
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
2025 年 5 月 23 日
1.需要使用 @JsonDeserialize 字节定义一个反序列化方法
2.使用 @JsonSetter
Rickkkkkkk
2025 年 5 月 23 日
手动转换是最好的方案,你用一个中间结构体去接,然后把这个中间结构体转换成你期望的对象

你用一些“奇技淫巧”做到看起来方便的方案都是为后续的迭代挖坑,包括看不明白、不知道怎么支持新字段等等
zhwguest
2025 年 5 月 23 日
咱们至少要说清楚用哪个库来序列化吧,有的库是运行期反射,有的库是插件注解。差异可大了。
aispring
2025 年 5 月 23 日
@shubiao 不行,没成功
aispring
2025 年 5 月 23 日
@zhwguest 标题里的 Jackson ,Java 的一个库
Hayson
2025 年 5 月 23 日
aispring
2025 年 5 月 23 日
@Hayson 功能不一样
zhwguest
2025 年 5 月 23 日
@aispring 抱歉啊,我对这个库不了解,所以还以为就是通常意义上的 json 类型呢,再次抱歉哈
spritecn
2025 年 5 月 23 日
@Rickkkkkkk 赞同,怎么直接怎么来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1133881

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX