JAX-RS(Jersey):来自JSON请求体的字符串仍然被转义

时间:2016-03-29 08:53:33

标签: jersey glassfish jax-rs

这让我发疯了。我在JAX-RS(Glassfish / Jersey)中处理REST端点。我有一个方法,它应该接收一个字符串,存储它并返回它。整个端点应该使用并生成JSON。但是每当我向方法发布一个字符串时,它都会以转义的形式传递给我。例如。如果我发布:

fetch("http://localhost:8080/myapp/rest/myresource", {
  method: "post",
  credentials: 'same-origin',
  body: JSON.stringify("test\ntest"),
  headers: {
    "Content-Type": "application/json"
  }
})

,资源是:

@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class MyResource {

    @POST
    public String set(@NotNull String value){
        // store it
        return storedValue;
    }
}

然后存储并返回客户端的是:

"test\ntest"

但是,如果我将String包装在一个对象中:

fetch("http://localhost:8080/myapp/rest/myresource", {
  method: "post",
  credentials: 'same-origin',
  body: JSON.stringify({value: "test\ntest"}),
  headers: {
    "Content-Type": "application/json"
  }
})

资源

@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class MyResource {

    @XmlRootElement
    public static class Wrapper {
        public String value;
    }

    @POST
    public String set(@NotNull Wrapper wrapper) {
        String value = wrapper.value;
        // store it
        return storedValue;
    }
}

然后存储并返回给客户端的值是

test
test

我错过了什么吗?

Glassfish 4.1.1
 - jersey 2.10.4-0
 - json 1.0-0.1

2 个答案:

答案 0 :(得分:0)

这似乎是一个功能:传递字符串时Jackson assumes you're doing the encoding/decoding yourself

我会留在这里为子孙后代。

答案 1 :(得分:0)

为了使用JAX-RS将原始String发布为JSON,您可以使用" @JsonRawValue"由fasterxml.jackson提供

Class ResponseObject {

@JsonRawValue
String jsonString;
...
}

无论何时发送响应对象,都会发送未转义的未转义的json。