什么是最好的json pojo转换器

时间:2013-10-09 15:34:57

标签: json jackson gson pojo java-api

这里我列出了一些json到pojo convertion java api的

  1. GSON
  2. 杰克逊
  3. JS​​ONGen
  4. JSON工具
  5. 请根据他们的表现和易用性列出这些api。如果还有其他java api比上面的

    更好,请告诉我

1 个答案:

答案 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技术的了解,希望这对你有所帮助。 :)