1

在这里,我列出了一些 json 到 pojo 转换 java api 的

  1. GSon
  2. 杰克逊
  3. JSONGen
  4. JSON 工具

您能否根据它们的性能和易用性列出这些 api。也让我知道是否有任何其他比上述更好的java api

4

1 回答 1

1

这主要取决于您正在开发哪种应用程序的上下文,它是在客户端(例如,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 技术的全部了解,希望对您有所帮助。:)

于 2013-10-14T02:55:56.447 回答