【问题标题】:How can I tweak the JSON that gets generated by Jackson's JAXRS provider?如何调整由 Jackson 的 JAXRS 提供程序生成的 JSON?
【发布时间】:2014-05-14 21:35:59
【问题描述】:

我正在使用 jersey 和 jackson 来格式化 JSON 输出。

Java 源代码如下所示:

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

import javax.json.Json;
import javax.json.JsonObject;

@Path("/hello")
public class Hello {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public JsonObject reservations() {
        JsonObject result = Json.createObjectBuilder()
            .add("hello","world")
            .add("name", "Bowes")
            .add("id", "4E37071A-CB20-49B8-9C82-F2A39639C1A3")
            .add("age", 25)
            .build();
        return result;
    }
}

我在 pom.xml 文件中依赖于 Jackson,如下所示:

<!-- avoid this message:
     org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:
     MessageBodyWriter not found for media type=application/json -->
<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.3.3</version>
</dependency>

今天的输出是这样的:

{"hello":{"chars":"world","string":"world","valueType":"STRING"},"name":{"chars":"Bowes","string":"Bowes","valueType":"STRING"},"id":{"chars":"4E37071A-CB20-49B8-9C82-F2A39639C1A3","string":"4E37071A-CB20-49B8-9C82-F2A39639C1A3","valueType":"STRING"},"age":{"integral":true,"valueType":"NUMBER"}}

我真的希望它被格式化并省略“chars”和“valueType”字段。像这样:

{
  "hello": "world",
  "name": "Bowes",
  "id": "4E37071A-CB20-49B8-9C82-F2A39639C1A3",
  "age": 25
}

我该怎么做?

【问题讨论】:

    标签: jersey jackson jax-rs


    【解决方案1】:

    我认为问题是因为您返回的是 JsonObject 而不是 String。默认情况下,序列化JsonObject 需要返回足够的信息,以便能够在反序列化时重新创建它。

    您可以使用 JsonWriter 将其转换为 String 并返回它,或者更好的是,使用您的字段创建一个本地静态类并简单地返回对象。由于您的方法被标记为返回 JSON,Jersey/Jackson 将自动为您序列化您的对象。根据您的 Jackson 设置,您可能需要注释您的课程,以便 Jackson 知道如何处理它。

    @JsonAutoDetect(fieldVisibility = Visibility.ANY)
    private static class MyReturn {
        String hello;
        String name;
        UUID id;
        int age;
    }
    

    【讨论】:

    • 在 JsonObject 上执行 .toString() 方法,即:return Json.createObjectBuilder().add(...).build().toString();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2023-03-15
    • 1970-01-01
    • 2016-05-19
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多