【问题标题】:Why JSON pretty print is not working?为什么 JSON 漂亮的打印不起作用?
【发布时间】:2015-06-25 18:25:50
【问题描述】:

我正在尝试做与this question 相同的事情,但我已经尝试了我发现的所有可能性,但我无法让它发挥作用。

到目前为止,我有这个代码:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
//import javax.ws.rs.core.MediaType;

import org.jboss.resteasy.annotations.providers.jaxb.json.BadgerFish;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.jaxrs.annotation.JacksonFeatures;

@Path(value = "/mock")
@Controller
public class MockController {

    @BadgerFish
    @GET
    @Path(value = "/get")
    @Produces(MediaType.APPLICATION_JSON_VALUE)
    @JacksonFeatures(serializationEnable = {SerializationFeature.INDENT_OUTPUT})
    public Container getMockedContainer() {
        return newContainer();
    }

    @BadgerFish
    @GET
    @Path(value = "/getXML")
    @Produces(value = MediaType.APPLICATION_XML_VALUE)
    public Container getMockedContainerXML() {
        return newContainer();
    }

    //MORE CODE HERE
}

我可以转到http://localhost:8081/containerMocked/mock/getXML/ 并获得预期的 XML 输出,很简单。但是当我尝试localhost/.../get/ 时,我得到了正确的数据,但打印出来的不是很漂亮。

至少对我来说,@Produces(MediaType.APPLICATION_JSON)@JacksonFeatures(serializationEnable = { SerializationFeature.INDENT_OUTPUT}) 应该足够了。

我做错了什么?

免责声明:我不会在这里介绍newContainer() 所做的事情,因为它涉及的课程太多。你必须明白的是这个Main

public static void main(String[] args) throws javax.xml.bind.JAXBException {
    Container container = new MockController().newContainer();
    final javax.xml.bind.JAXBContext jaxbContext = javax.xml.bind.JAXBContext.newInstance(Container.class);
    javax.xml.bind.Marshaller marshaller = jaxbContext.createMarshaller();
    marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    marshaller.marshal(container, System.out);
}

将输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<container>
    <leaf>
        <id>int32</id>
        <possibleValues/>
        <type>int32</type>
        <value>2147483647</value>
    </leaf>
    <id>device</id>
</container>

http://localhost:8081/containerMocked/mock/get/ 将输出:

{"container":{"leaf":{"id":{"$":"int32"},"possibleValues":{},"type":{"$":"int32"},"value":{"$":"2147483647"}},"id":{"$":"device"}}}

编辑:我刚刚根据this link测试了@Formatted注解,也没有得到任何结果。

为什么这些注解不起作用,而 @Produces@BadgerFish 却能正常工作?

如果可能的话,我宁愿以最简单的方式来做。对我来说,最简单的方法是让上述注释之一按预期工作。

【问题讨论】:

  • 仅供参考,您可以在路径中省略 get。 HTTP 动词将传达该信息。
  • 它就在那里,因为我已经得到了带有该注释的项目。我会尝试不使用它。

标签: java json spring jackson pretty-print


【解决方案1】:

您可以尝试使用您的 JAX-RS 实现注册 ObjectMapper 提供程序:

@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {

    @Override
    public ObjectMapper getContext(Class<?> aClass) {
        return new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
    }
}

【讨论】:

  • 我试图根据您所说的实现与我提到的问题的答案类似的东西,但我想我不确定如何正确实现它。我看到了ObjectMapper 的一些示例,但我从未使用过它,我将如何将我的数据传递给它?
  • @PatrickBard 看起来您正在使用 RESTEasy?如果是这样,当 Container(或任何 Java 对象)被转换为响应体时,RE 将在幕后为您处理它。
猜你喜欢
  • 1970-01-01
  • 2013-08-13
  • 2015-06-26
  • 2014-05-19
  • 2014-08-05
  • 2021-01-31
  • 2014-05-12
  • 2013-03-19
相关资源
最近更新 更多