Jersey 如何调整Jackson生成的JSON';JAXRS提供者?

Jersey 如何调整Jackson生成的JSON';JAXRS提供者?,jersey,jackson,jax-rs,Jersey,Jackson,Jax Rs,我使用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 {

我使用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;
    }
}
<!-- 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"}}
{
  "hello": "world",
  "name": "Bowes",
  "id": "4E37071A-CB20-49B8-9C82-F2A39639C1A3",
  "age": 25
}
我在pom.xml文件中依赖Jackson,如下所示:

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;
    }
}
<!-- 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"}}
{
  "hello": "world",
  "name": "Bowes",
  "id": "4E37071A-CB20-49B8-9C82-F2A39639C1A3",
  "age": 25
}
我真的希望它被格式化,并且省略“chars”和“valueType”字段。像这样:

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;
    }
}
<!-- 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"}}
{
  "hello": "world",
  "name": "Bowes",
  "id": "4E37071A-CB20-49B8-9C82-F2A39639C1A3",
  "age": 25
}

我该怎么做

我认为问题是因为您返回的是
JsonObject
而不是
字符串。在默认情况下,序列化
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()方法,执行技巧如下:
返回Json.createObjectBuilder().add(…).build().toString()