使用RESTful Jersey返回自定义JSON

时间:2014-05-11 16:18:35

标签: java json

这是我第一次尝试使用Maven和Jersey。我已经阅读了很多关于JSON的文章。我想知道如果没有简单的JSON和GSON,我的问题是否可以解决。

当我访问localhost:8080/helloWorld/example1/example2/example3时,我会得到类似的内容

{"first": example1, "second": example2, "third":example3}

一开始不错,但我想得到这样的回复:

{
  "firstMap": {"first": example1, "second": example2},
  "secondMap":{"third": example3}
}

我尝试制作responseWrapper类,但它返回

{
  "firstMap": {"first": example1, "second": example2, "third": null},
  "secondMap":{"first": null, "second": null, "third": example3}
}.

我不希望显示这些空值。我该怎么做?

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("sample")
public class HelloWorldService {

    @Path("/helloWorld/{first}/{second}/{third}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public HelloWorld helloWorld(@PathParam("first") String first, @PathParam("second") String  second, @PathParam("third") String third) {
        return new HelloWorld(first, second, third);
    }
}

还有:

public class HelloWorld {

    private String first;
    private String second;
    private String third;

public HelloWorld(String first, String second) {
    this.first = first;
    this.second = second;

}

public HelloWorld(String third, String third) {
    this.third = third;

}

public HelloWorld(){
}

    public HelloWorld(String first) {
        this.first= first;
    }

    public String getFirst() {
        return first;
    }

    public String getSecond(){
        return second;
    }

    public String getThird(){
        return third;

3 个答案:

答案 0 :(得分:1)

如果只是为了这种用法而需要它,你可以尝试模仿类本身,这样当它被序列化时,它将以你想要的格式生成。 Gson将允许您为类编写自定义序列化和反序列化,但随后您将失去自动化。这可能是HelloWorld类的代码:

public class HelloWorld {

    public class Data1
    {
        private String first;
        private String second;
            // getter and setters...
    }

    private Data1 firstMap;

    public class Data2
    {
        private String third;
            // getter and setters...
    }

    private Data2 secondMap;
    // ...
}

答案 1 :(得分:1)

如果你想要一个这种形式的json

{
  "firstMap": {"first": example1, "second": example2},
  "secondMap":{"third": example3}
}

从服务中返回的对象应具有此结构。

public class Root {
  public First firstMap;
  public Third secondMap;
}

public class First {
  public String first;
  public String second;
}

public class Third {
  public String third;
}

然后你可以使用像Genson这样的库,它可以很好地与泽西一起玩。您只需要在类路径中使用Genson,然后它将自动启用并处理json ser / de。

答案 2 :(得分:0)

Gson有一个GsonBuilder类来在构造Gson主对象时设置格式化标志。寻找setPettyPrinting()将其格式化为人类可读和serializeNulls(),以便切换打印null。默认情况下,打印空值关闭。从Web服务中使用它时,Jackson库可以为您提供更多的注释控制,并且可以更好地与spring集成。如果您使用Spring,我强烈推荐。