【问题标题】:JAX-RS (Jersey): String from JSON request body still escapedJAX-RS (Jersey):来自 JSON 请求正文的字符串仍然转义
【发布时间】:2016-03-29 08:53:33
【问题描述】:

这快把我逼疯了。我正在研究 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"

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

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

【问题讨论】:

    标签: jersey glassfish jax-rs


    【解决方案1】:

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

    我会把它留给后代。

    【讨论】:

      【解决方案2】:

      为了使用 JAX-RS 将原始字符串发布为 JSON,您可以使用 fasterxml.jackson 提供的“@JsonRawValue”

      Class ResponseObject {
      
      @JsonRawValue
      String jsonString;
      ...
      }
      

      每当您发送响应对象时,都会发送未转义的 json 且不带斜线。

      【讨论】:

        猜你喜欢
        • 2017-07-06
        • 1970-01-01
        • 2015-04-07
        • 2011-06-21
        • 2016-03-23
        • 1970-01-01
        • 2016-04-13
        • 1970-01-01
        • 2018-09-11
        相关资源
        最近更新 更多