杰克逊在json中添加了反斜杠

我在Jersey上构建REST服务,并使用Jackson从我的模型的java类生成JSON。 模型具有绝对简单的价值,我认为这是最典型的案例。 但是我得到了奇怪的结果:

[{"name":"Nick","role":"admin","age":"32","rating":47}]

我期待的结果是:

[{"name":"Nick","role":"admin","age":"32","rating":47}]

我的字段的源值不包含任何特殊字符。 这些都是简单的话。

有我的Java类。 实体:

public class User {

  private String name;

  private String role;

  private String age;

  private Integer rating;

休息服务类别:

@ServiceConfig(contextName = "myContext")
@Path("/myrest")
public class MyRestService {

  private static final String JSON_CONTENT_TYPE = MediaType.APPLICATION_JSON + ";charset=UTF-8";

  @Context
  protected HttpServletResponse response;

  @GET
  @Path("/users")
  @OpenTransaction
  @Produces({MediaType.APPLICATION_JSON})
  public String findUsers(@QueryParam("department") String department) {

    response.setContentType(JSON_CONTENT_TYPE);
    PDTResponse.status(response).sendStatus(Response.Status.OK.getStatusCode());

    List<User> users = new ArrayList<>();
    users.add(new User("Nick", "admin", "32", 47));

    String jsonInString;
    ObjectMapper mapper = new ObjectMapper();
    try {
        jsonInString = mapper.writeValueAsString(users);
    } catch (JsonProcessingException ex) {
        jsonInString = "thrown exception: " + ex.getMessage();
    }
    return jsonInString;
}

我试图使用注释@JsonRawValue来获取字符串属性:

@JsonRawValue
private String name;

但在这种情况下的结果是:

[{"name":Nick,"role":admin,"age":32,"rating":47}]

我期望:

[{"name":"Nick","role":"admin","age":"32","rating":47}]

很明显,杰克逊以某种方式在回应的结果中逃避了引号。 但为什么它这样做,最重要的是如何避免这种情况? 它们本身就是弦乐! 没有任何引号或特殊字符。

我使用Java 7Jackson 2.6.1 。 和Postman来测试结果。 任何想法解决我的问题?


java中的所有字符串都必须在其中引号。 所以jsonInString应该有斜杠。 当你输出jsonInString时,虽然它不应该有引号。 你在调试器或其他东西中看它吗?


您可以配置ObjectMapper:

final ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
String jsonUsers = mapper.writeValueAsString(users);

更多信息在这里


看起来你已经完成了JAX-RS资源类的复杂化。

要使用Jackson作为Jersey 2.x的JSON提供程序,您不需要创建一个像这样的ObjectMapper实例。 有一个更好的方法来实现它。 继续阅读以了解更多细节。

添加杰克逊模块依赖关系

要将Jackson 2.x用作JSON提供程序,您需要将jersey-media-json-jackson模块添加到您的pom.xml文件中:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.25.1</version>
</dependency>

注册Jackson模块

然后在您的Application / ResourceConfig子类中注册JacksonFeature

@ApplicationPath("/api")
public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(JacksonFeature.class);
        return classes;
    }
}
@ApplicationPath("/api")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
        register(JacksonFeature.class);
    }
}

如果您没有Application / ResourceConfig子类,则可以在您的web.xml部署描述符中注册JacksonFeature 。 特定的资源,提供者和功能完全限定的类名可以用jersey.config.server.provider.classnames初始化参数的逗号分隔值提供。

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
</init-param>

Jackson提供的MessageBodyWriterJacksonJsonProvider 。 有关如何将Jackson用作JSON提供者的更多详细信息,请查看此答案。 如果您需要自定义ObjectMapper ,请参阅此答案。

修复你的资源类

通过使用上述方法,您的资源类可以像下面这样简单:

@Path("/users")
public class MyRestService {

  @GET
  @Produces({MediaType.APPLICATION_JSON + ";charset=UTF-8"})
  public List<User> findUsers() {

    List<User> users = new ArrayList<>();
    users.add(new User("Nick", "admin", "32", 47));

    return Response.ok(users).build();
}

当请求这样的端点时,它会给你预期的JSON结果。

链接地址: http://www.djcxy.com/p/38169.html

上一篇: Jackson adds backslash in json

下一篇: ruby on rails