在这里,我列出了一些 json 到 pojo 转换 java api 的
- GSon
- 杰克逊
- JSONGen
- JSON 工具
您能否根据它们的性能和易用性列出这些 api。也让我知道是否有任何其他比上述更好的java api
这主要取决于您正在开发哪种应用程序的上下文,它是在客户端(例如,Android)还是在服务器端(例如,SpringMVC)。这是我的经验,也许有人有更多的点来证明我。我总是在 SpringMVC 服务器中使用 Jackson,为什么?因为它很简单,当您开发 RESTfull Web 服务时,您将系统的管理留给 SpringMVC,例如重定向请求、执行业务逻辑等等。然后,您将有两个 servlet 一个来管理页面请求,例如转到http://myserver.com/home/myprofile/和另一个公开 RESTfull api 的 servlet,这是 Jackson 进入的地方,正如你知道(或者可能不知道)在 Tomcat 中运行的所有 webapps 都有一个 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();
}
}
您可以返回一个对象集合,Jersey 将负责序列化它们。幕后的一切都没有配置,只有一些 xml。当然,您可以使用其他库在服务器端序列化 json,例如 GSON。但是你必须实现你自己的 HttpMessageConverter(这个类负责序列化/反序列化 json)Jersey 已经拥有的东西。
我总是在客户端(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 技术的全部了解,希望对您有所帮助。:)