Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java glassfish版本中JSON输出的差异_Java_Json_Jersey_Glassfish - Fatal编程技术网

Java glassfish版本中JSON输出的差异

Java glassfish版本中JSON输出的差异,java,json,jersey,glassfish,Java,Json,Jersey,Glassfish,在Glassfish 3.1.2和4.1.2中使用代码相同的Jersey并进行测试会产生不同的结果输出。代码如下: @GET @Produces(MediaType.APPLICATION_JSON) public ArrayList<Lenovo> getList(@DefaultValue("0") @QueryParam("limit") final int limit, @Defa

在Glassfish 3.1.2和4.1.2中使用代码相同的Jersey并进行测试会产生不同的结果输出。代码如下:

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public ArrayList<Lenovo> getList(@DefaultValue("0") @QueryParam("limit") final int limit,
                                    @DefaultValue("0") @QueryParam("offset") final int offset,
                                    @DefaultValue("0") @QueryParam("id") final int id,
                                    @DefaultValue("") @QueryParam("series") final String series) {

        DBBase obj = new Lenovo(id, series);
        DBSearch dbs = new DBSearch(limit, offset, obj);

        return bl.getList(dbs);
    }
Glassfish 4.1.2的JSON输出:

    [
      { 
        "id": "1",
        "series": "x220"
      },
      { 
        "id": "2",
        "series": "x230"
      }
    ]
从数据库获取数据并返回对象

    ArrayList<Agama> rtn = new ArrayList<Lenovo>();

    ResultSet rs = stmt.executeQuery(sql.toString());

        while (rs.next()) {
            rtn.add(new Lenovo(rs));
        }

    return rtn;

我曾尝试使用java平台JDK1.6和1.7来同时使用GLassfish,得到了相同的结果。如何在不同的Glassfish版本中使用相同的代码获得相同的JSON结果输出。谢谢。

这是因为他们使用不同的序列化程序。GlassFish3正在使用一些内部序列化程序。您可以将它配置为使用Jackson 1,只使用web.xml配置swtich,但Glassfish 4在默认情况下仍使用MOXy作为其序列化程序

如果您想要相同的行为,最好的方法就是使用相同的序列化程序。您可以添加以下(Jackson 2)依赖项

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.8.5</version>
</dependency>
如果您使用的是
应用程序
子类,您可以

<init-param>
    <param-name>jersey.config.disableMoxyJson</param-name>
    <param-value>true</param-value>
</init-param>
class MyApplication extends Application {
    @Override
    public Map<String, String> getProperties() {
        Map<String, String> props = new HashMap<>();
        props.put("jersey.config.disableMoxyJson", "true");
        return props;
    }
}
类MyApplication扩展了应用程序{
@凌驾
公共映射getProperties(){
Map props=newhashmap();
put(“jersey.config.disableoxyJSON”、“true”);
返回道具;
}
}

在我看来不是有效的json。无论如何,请发布
Lenovo
类。@MouseEvent我发布了Lenovo类,相同的代码在不同的GF中尝试得到不同的结果。仅供参考,后一个json是正确的。可能修正了早期版本中的一个bug。如果您真的想要前者,您可以定义一个只保存数组列表的包装器类(当然它也应该有正确的jaxb注释)并返回它。
<init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>com.fasterxml.jackson.jaxrs.json</param-value>
</init-param>
<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>com.fasterxml.jackson.jaxrs.json</param-value>
</init-param>
<param-value>
    com.fasterxml.jackson.jaxrs.json,
    com.fasterxml.jackson.jaxrs.base   <----
</param-value>
<init-param>
    <param-name>jersey.config.disableMoxyJson</param-name>
    <param-value>true</param-value>
</init-param>
class MyApplication extends Application {
    @Override
    public Map<String, String> getProperties() {
        Map<String, String> props = new HashMap<>();
        props.put("jersey.config.disableMoxyJson", "true");
        return props;
    }
}