gpt4 book ai didi

json - Spring和Jackson Json,用 View 序列化不同的字段

转载 作者:IT老高 更新时间:2023-10-28 13:49:34 26 4
gpt4 key购买 nike

previous similar question 中,我问过,如何使用 JacksonJson 和 Spring 序列化两组不同的字段。

我的用例是典型的 Controller 映射 @ResponseBody注释直接返回特定对象或对象集合,然后在客户端添加 application/json 时使用 JacksonJson 呈现在 Accept标题。

我有两个答案,第一个建议使用不同的 getter 列表返回不同的接口(interface),第二个建议使用 Json Views。

在阅读了 JacksonJsonViews 上的文档后,我对第一种方法的理解没有问题,但是第二种方法。 ,不知道怎么用Spring实现。

为了继续举例,我将在 Views 类中声明三个 stub 类:

// View definitions:
public class Views {
public static class Public { }
public static class ExtendedPublic extends PublicView { }
public static class Internal extends ExtendedPublicView { }
}

然后我要声明提到的类:

public class PublicView { }   
public class ExtendedPublicView { }

他们到底为什么要声明空静态类和外部空类,我不知道。我知道他们需要一个“标签”,但是 Views 的静态成员就足够了。并不是ExtendedPublic延长 Public ,因为这是合乎逻辑的,但实际上它们完全不相关。

最后,bean 将通过注解指定 View 或 View 列表:

//changed other classes to String for simplicity and fixed typo 
//in classname, the values are hardcoded, just for testing
public class Bean {
// Name is public
@JsonView(Views.Public.class)
String name = "just testing";

// Address semi-public
@JsonView(Views.ExtendedPublic.class)
String address = "address";

// SSN only for internal usage
@JsonView(Views.Internal.class)
String ssn = "32342342";
}

最后在 Spring Controller 中,我要考虑如何更改我的测试 bean 的原始映射:

@RequestMapping(value = "/bean") 
@ResponseBody
public final Bean getBean() {
return new Bean();
}

它说调用:

//or, starting with 1.5, more convenient (ObjectWriter is reusable too)
objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance);

所以我有一个 ObjectMapper突然出现的实例和 out这不是典型的 servlet PrintWriter out = response.getWriter(); , 但是是 JsonGenerator 的一个实例并且无法使用 new 运算符获得。所以不知道怎么修改方法,这里是一个不完整的尝试:

@RequestMapping(value = "/bean")
@ResponseBody
public final Bean getBean() throws JsonGenerationException, JsonMappingException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
JsonGenerator out; //how to create?
objectMapper.viewWriter(Views.Public.class).writeValue(out, new Bean());
return ??; //what should I return?
}

所以我想知道是否有人成功使用 JsonView与 Spring 以及他/她是如何做到的。整个概念看起来很有趣,但文档似乎缺乏,示例代码也不见了。

如果不可能,我将只使用相互扩展的接口(interface)。抱歉问了这么长的问题。

最佳答案

根据@igbopie 和@chrislovecnm 的回答,我整理了一个注释驱动的解决方案:

@Controller
public class BookService
{
@RequestMapping("/books")
@ResponseView(SummaryView.class)
public @ResponseBody List<Book> getBookSummaries() {}

@RequestMapping("/books/{bookId}")
public @ResponseBody Book getBook(@PathVariable("bookId") Long BookId) {}
}

SummaryViewBook 模型上的注释如下:

@Data
class Book extends BaseEntity
{
@JsonView(SummaryView.class)
private String title;
@JsonView(SummaryView.class)
private String author;
private String review;

public static interface SummaryView extends BaseView {}
}

@Data
public class BaseEntity
{
@JsonView(BaseView.class)
private Long id;
}

public interface BaseView {}

然后将自定义 HandlerMethodReturnValueHandler 连接到 Spring MVC 的上下文中以检测 @ResponseView 注释,并相应地应用 Jackson View 。

我已提供完整代码 over on my blog .

关于json - Spring和Jackson Json,用 View 序列化不同的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7793689/

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