问题是杰克逊不知道如何创建
JSONObject(至少在没有帮助的情况下)。Jackson主要处理基本类型和POJO。如果您希望能够处理
JSONObject(假设这是来自的对象
org.json),则可
jackson-datatype-json-org以为Jackson支持添加。
下面是一个完整的测试。这是我用来测试的依赖项
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20141113</version></dependency><dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.16</version></dependency><dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-json-org</artifactId> <version>2.3.2</version></dependency><dependency> <groupId>org.glassfish.jersey.test-framework.providers</groupId> <artifactId>jersey-test-framework-provider-grizzly2</artifactId> <version>2.16</version> <scope>test</scope></dependency>
注意: 我使用
jackson-datatype-json-org的Jackson版本与
jersey-media-json-jackson2.16 使用的Jackson版本相同。如果您使用的球衣杰克逊版本不同,则需要确保引入的杰克逊版本与
jackson-datatype-json-org您使用的版本相同。这样,我们就不会混合Jackson版本。
这是使用Jersey测试框架的测试
import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.datatype.jsonorg.JsonOrgModule;import javax.ws.rs.Consumes;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.ext.Provider;import javax.ws.rs.ext.ContextResolver;import javax.ws.rs.client.Entity;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.Response;import org.glassfish.jersey.client.ClientConfig;import org.glassfish.jersey.jackson.JacksonFeature;import org.glassfish.jersey.server.ResourceConfig;import org.glassfish.jersey.test.JerseyTest;import org.json.JSONObject;import org.junit.Test;import static junit.framework.Assert.*;public class JsonOrgTest extends JerseyTest { public static class Model { public String firstName; public String lastName; public JSonObject other; // should br private with correct getters and setters } @Path("model") public static class ModelResource { @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response post(Model model) { return Response.ok(model).build(); } } @Provider public static class ObjectMapperProvider implements ContextResolver<ObjectMapper> { private final ObjectMapper mapper; public ObjectMapperProvider() { mapper = new ObjectMapper(); mapper.registerModule(new JsonOrgModule()); } @Override public ObjectMapper getContext(Class<?> type) { return mapper; } } @Override public ResourceConfig configure() { return new ResourceConfig(ModelResource.class) .register(ObjectMapperProvider.class) .register(JacksonFeature.class); } @Override public void configureClient(ClientConfig config) { config.register(JacksonFeature.class); config.register(ObjectMapperProvider.class); } @Test public void should_return_org_json_data() { final String json = "{n" + " "firstName": "pee",n" + " "lastName": "skillet",n" + " "other": {n" + " "age": 100,n" + " "birthday": "yesterday"n" + " }n" + "}"; Response response = target("model").request().post(Entity.json(json)); if (response.getStatus() != 200) { System.out.println(response.getStatus() + ": " + response.readEntity(String.class)); fail("should return data and 200"); } else { Model model = response.readEntity(Model.class); JSonObject other = model.other; System.out.println(other.toString()); assertEquals("pee", model.firstName); assertEquals("skillet", model.lastName); assertEquals(100, other.getInt("age")); assertEquals("yesterday", other.getString("birthday")); } }}您还应该做的是摆脱上面评论中的 所有 Jackson依赖项。您只需要一个依赖项即可支持Jackson JSON。
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.16</version></dependency>
还要注意
ObjectMapperProvider测试中的。您将需要此注册
JsonOrgModule与
ObjectMapper为了让杰克逊能够处理
JSONObject。这个很重要。如果您没有
ContextResolver,则上面的示例将失败。



