我想在REST应用程序中接受和响应JSON对象。我需要发送和接收的数据在.properties文件中。我已经阅读了它们,现在位于PropertiesObject(From java.util.Properties)中。是否可以在Properties不实现新类的情况下编组和解组对象?
Properties
java.util.Properties
我在Weblogic服务器中使用Jax-rs API。
@POST @Path("{id}") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public JSONObject getbyID(@PathParam("id")JSONObject inputJsonObj) { //marshalling and unmarshalling goes here }
对WebLogic不太熟悉,因此我不知道它使用的是哪个版本的Jersey(1.x或2.x),但是使用1.x,您可以简单地添加此依赖项
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>${jersey-version}</version> </dependency>
这将取决于杰克逊。Jackson已经反序列化该Properties对象并将其序列化为JSON对象。
这是一个简单的测试
资源资源
@Path("/properties") public class PropertiesResource { @GET @Produces(MediaType.APPLICATION_JSON) public Response getProperties() throws Exception { FileInputStream fis = new FileInputStream("test.properties"); Properties props = new Properties(); props.load(fis); return Response.ok(props).build(); } @POST @Consumes(MediaType.APPLICATION_JSON) public Response postProperties(Properties properties) { StringBuilder builder = new StringBuilder(); for (String key: properties.stringPropertyNames()) { builder.append(key).append("=") .append(properties.getProperty(key)).append("\n"); } return Response.created(null).entity(builder.toString()).build(); } }
测试
public void testMyResource() throws Exception { ClientConfig config = new DefaultClientConfig(); config.getClasses().add(JacksonJsonProvider.class); config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); Client c = Client.create(config); WebResource resource = c.resource(Main.BASE_URI).path("properties"); String json = resource.accept("application/json").get(String.class); System.out.println(json); FileInputStream fis = new FileInputStream("test.properties"); Properties props = new Properties(); props.load(fis); String postResponse = resource.type("application/json").post(String.class, props); System.out.println(postResponse); }
结果:
// from get {"prop3":"value3","prop2":"value2","prop1":"value1"} // from post prop3=value3 prop2=value2 prop1=value1
对于配置,您只需要配置POJOMapping功能并注册Jackson提供程序
程式化
public class JerseyApplication extends ResourceConfig { public JerseyApplication() { packages(...); getProviderClasses().add(JacksonJsonProvider.class); getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); } }
web.xml
<init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param>
使用Jersey 2.x ,它会更简单一些。我们只需要这个提供者
<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.4.0</version> </dependency>
并注册相同的JacksonJaxbJsonProvider(尽管不同的包,类名是相同的)。不需要Pojo映射功能。
JacksonJaxbJsonProvider
注意: 在两种情况下,都有两个Jackson提供程序,a JacksonJsonProvider和a JacksonJaxbJsonProvider。如果希望pojos的编组依赖于JAXB批注,则应注册后者。
JacksonJsonProvider