gpt4 book ai didi

json - 结合 Jackson @JsonView 和 @JsonProperty

转载 作者:行者123 更新时间:2023-12-05 04:12:06 24 4
gpt4 key购买 nike

有没有一种方法不仅可以通过在@JsonView 中使用不同的类来查看/隐藏字段,还可以根据每个字段分别使用的 View 定义不同的名称(如@JsonProperty)?

问候和感谢!蒂姆

最佳答案

我的解决方案涉及 Jackson Mixin 功能。
我使用相同的 View 类来放置不同的 @jsonProperty 注释。这比单独的类更方便,但是,现在您不能使用 View 的继承。如果您需要这个,您将必须创建单独的类来保存 @jsonProperty 注释并相应地更改 mixin 模块。

这里是要序列化的对象:

public class Bean
{
@JsonView({Views.Public.class, Views.Internal.class})
public String name;

@JsonView(Views.Internal.class)
public String ssn;
}

带有 json 属性注释的 View

public class Views
{
public static class Public {
@JsonProperty("public_name")
public String name;
}

public static class Internal {
@JsonProperty("internal_name")
public String name;
}
}

Jackson 需要的 mixin 模块:

@SuppressWarnings("serial")
public class PublicModule extends SimpleModule
{
public PublicModule() {
super("PublicModule");
}

@Override
public void setupModule(SetupContext context)
{
context.setMixInAnnotations(Bean.class, Views.Public.class);
}
}

@SuppressWarnings("serial")
public class InternalModule extends SimpleModule
{
public InternalModule() {
super("InternalModule");
}

@Override
public void setupModule(SetupContext context)
{
context.setMixInAnnotations(Bean.class, Views.Internal.class);
}
}

测试方法:

public static void main(String[] args)
{
Bean bean = new Bean();
bean.name = "my name";
bean.ssn = "123-456-789";

ObjectMapper mapper = new ObjectMapper();
System.out.println(args[0] + ": ");
try {
if (args[0].equals("public")) {
mapper.registerModule(new PublicModule());
mapper.writerWithView(Views.Public.class).writeValue(System.out, bean);
} else {
mapper.registerModule(new InternalModule());
mapper.writerWithView(Views.Internal.class).writeValue(System.out, bean);
}
} catch (IOException e) {
e.printStackTrace();
}
}

带有两个独立调用的输出:

public: 
{"public_name":"my name"}
internal:
{"ssn":"123-456-789","internal_name":"my name"}

关于json - 结合 Jackson @JsonView 和 @JsonProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41205158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com