Jersey 客户端发送 application/json 类型的字符串

Jersey client send string with application/json type

我需要使用 Jersey client 1.19genson 1.3

发送一个已经是 JSON 格式的字符串
Client.create().resource(path).webResource.type(MediaType.APPLICATION_JSON_TYPE)
.accept(MediaType.APPLICATION_JSON_TYPE).put(ClientResponse.class, jsonAsString)

这个问题是客户端正在解析字符串,我需要它按原样发送。 我正在发送类似 { "name":"Foo" } 的内容,客户端正在将其转换为 "{ \"name\":\"Foo\" }"。如果我将类型更改为 PLAIN_TEXT 它会正确发送请求,但我需要将其发送为 application/json .

尝试将 MediaType.APPLICATION_JSON_TYPE 更改为 MediaType.APPLICATION_JSON http://examples.javacodegeeks.com/enterprise-java/rest/jersey/json-example-with-jersey-jackson/

我用 Jersey 1.19、Genson 1.3 和 Wireshark 试过你的代码。它在没有 Genson 的情况下工作正常,因此 Genson 似乎将其视为文字字符串(因为它的类型为 String),因此引用了双引号。

以下作品。

    String jsonAsString = "{ \"name\":\"Foo\" }";
    Map<String, String> map = (new Genson()).deserialize(jsonAsString, Map.class);
    String path = "...";
    ClientResponse resp = 
            Client.create().resource(path)
            .type(MediaType.APPLICATION_JSON_TYPE)
            .accept(MediaType.APPLICATION_JSON_TYPE)
            .put(ClientResponse.class, map);

我使用了 Map,因为它对于示例来说已经足够了,但您可以将其反序列化为适当的对象。

如果您正在寻找一个选项来指定应按原样传递字符串,我还不知道,但这至少应该为将字符串作为 application/json 发送的问题提供解决方案.

所以是的,Genson 会尝试将您的字符串编码为文字 json 字符串。在这种情况下,它可能不是您想要的,但更普遍的是人们所期望的:serialize à java string as a json string.

当输入类型为字符串时,我看到的解决方案过于扩展 GensonJsonConverter 并将 isWritable 覆盖为 return false。然后注册它。那应该可以。

我已打开 this issue,因此可以将其添加为更灵活的功能。