这里我列出了一些json到pojo convertion java api的
请根据他们的表现和易用性列出这些api。如果还有其他java api比上面的
更好,请告诉我答案 0 :(得分:1)
主要取决于您开发的应用程序的上下文,它取决于客户端(例如Android)或服务器端(例如,SpringMVC)。这是我的经验,也许有人有更多的要点来证明我。我总是在SpringMVC服务器中使用Jackson,为什么?,因为它很简单,当你开发一个RESTfull web服务时,你会给SpringMVC留下系统的管理,比如重定向请求,执行业务逻辑等等。然后你将有两个servlet来管理页面请求,例如转到http://myserver.com/home/myprofile/和另一个servlet来公开RESTfull api,这就是Jackson进入的地方,你知道(或者可能不是)所有运行的webapps Tomcat有一个web.xml,在这里你告诉Tomcat实例谁servlet它将处理什么请求,结帐这个例子:
<!-- Spring MVC Dispatcher Servlet -->
<servlet>
<servlet-name>SpringMvcServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:config/applicationContext.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMvcServlet</servlet-name>
<url-pattern>/home/*</url-pattern>
</servlet-mapping>
<!-- Jersey -->
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>ar.com.kimboo.server.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
Jersey它是一个使用Jackson来序列化/反序列化HttpRequest的库。请注意,所有对/ home / *的请求都由SpringMVC处理,所有对/ rest / *的请求都由Jersey处理。所以,当你点击“http://server.com/server/rest/animals/”之类的内容并将请求传递给:
@Component
@Path("/animals")
public class AdvertisingRESTServiceImpl {
@Autowired AnimalServiceImpl animalsService;
/**
* @return All animals in the db.
* @uri http://localhost:8080/server/rest/animals/
*/
@GET @Path("/") @Produces(MediaType.APPLICATION_JSON)
public @ResponseBody List<Animals> getAllAnimals() {
return animalsService.getAllAnimals();
}
}
你可以返回一个对象集合,泽西岛将负责序列化它们。场景背后的一切都没有配置,只有一些xml。当然,您可以使用其他库来序列化服务器端的json,如GSON。但是你必须通过你自己的HttpMessageConverter(这个类负责序列化/反序列化json)来实现泽西已经拥有的东西。
总是我在客户端(Android)工作我使用gson从服务器端序列化/反序列化json。我更喜欢使用Gson,因为它非常简单,而不是使用RestTemplate或某些库。我唯一需要做的就是Gson ......没什么:
这将对象实例转换为json:
String json = new Gson().toJson(new Puppy("Robert",2));
这会将json变成一个对象:
Animal robert = new Gson().fromJson("{name:\"Robert\",age:\"2\"}", Animal.class);
使用这种工具,你可以做一些很酷的Restfull http客户端,比如这个:
public class HttpFuck {
Gson gson = new Gson();
public <T> T post(String url, Class<T> clazz, List<NameValuePair> parameters) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
try {
// Add your data
httppost.setEntity(new UrlEncodedFormEntity(parameters));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
StringBuilder json = inputStreamToString(response.getEntity().getContent());
T gsonObject = gson.fromJson(json.toString(), clazz);
return gsonObject;
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public <T> T get(String url, Class<T> clazz) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpGet httppost = new HttpGet(url);
try {
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
StringBuilder json = inputStreamToString(response.getEntity().getContent());
T gsonObject = gson.fromJson(json.toString(), clazz);
return gsonObject;
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
// Fast Implementation
private StringBuilder inputStreamToString(InputStream is) throws IOException {
String line = "";
StringBuilder total = new StringBuilder();
// Wrap a BufferedReader around the InputStream
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
// Read response until the end
while ((line = rd.readLine()) != null) {
total.append(line);
}
// Return full string
return total;
}
}
坏消息是你必须将几乎所有内容都包装在一个对象中。例如,你不能做new Gson().fromJson(string, String.class)
之类的事情。但它非常灵活,我强烈建议它在Android应用程序中使用它。
长话短说,这就是我对json技术的了解,希望这对你有所帮助。 :)