1

使用 Java 6、Tomcat 7、Jersey 1.15、Jackson 1.9.9,创建了一个具有以下架构的简单 Web 服务:

我的 POJO(模型类):

家庭.java:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Family {

    private String father;
    private String mother;

    private List<Children> children;

    // Getter & Setters
}

儿童.java:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Children {

    private String name;
    private String age;
    private String gender;

    // Getters & Setters
}

使用实用程序类,我决定对 POJO 进行硬编码,如下所示:

public class FamilyUtil {
    public static Family getFamily() {
        Family family = new Family();
        family.setFather("Joe");
        family.setMother("Jennifer");

        Children child = new Children();
        child.setName("Jimmy");
        child.setAge("12");
        child.setGender("male");
        List<Children> children = new ArrayList<Children>();

        children.add(child);

        family.setChildren(children);
        return family;
    }
}

我的网络服务:

@Path("")
public class MyWebService {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Family getFamily {
        return FamilyUtil.getFamily();
    }
}

产生:

{"children": [{"age":"12","gender":"male","name":"Jimmy"}],"father":"Joe", "mother":"Jennifer"}

我需要做的是让它以更清晰的方式生成它:

{ 
    "father":"Joe", 
    "mother":"Jennifer",
    "children": 
    [
        {
            "name":"Jimmy",
            "age":"12","
            "gender":"male"
        }
    ]
}

只是在寻找一种实现方式,以便它可以显示某种带有缩进/制表符的格式。

如果有人可以帮助我,将不胜感激。

感谢您抽出时间来阅读。

4

2 回答 2

2

您可以只返回一个字符串,而不是返回一个家庭(Web 服务调用者不会注意到差异)

@Path("")
public class MyWebService {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String getFamily {
        // ObjectMapper instantiation and configuration could be static...
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); 
        return mapper.writeValueAsString(FamilyUtil.getFamily());
    }
}

虽然,正如我在对您的问题的评论中所说,您的服务确实不应该这样做。应该由 Web 服务调用者将响应格式化为他们需要的任何格式。

于 2012-12-13T00:46:08.363 回答
-1

通过使用以下代码,我能够解决这个问题(不必要的引号和换行符转义序列):

@GET
@Produces(MediaType.APPLICATION_JSON)
public Family getFamily() throws JsonGenerationException, 
                                 JsonMappingException, 
                                 IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); 
        Family family = FamilyUtil.getFamily();
        return mapper.readValue(mapper.writeValueAsString(family),
                               FamilyUtil.getFamily().getClass());
}

像这样使用卷曲:

curl -X GET http://localhost:8080/mywebservice

产量:

{"children":[{"age":"12","gender":"male","name":"Jimmy"}],"father":"Joe","mother":"Jennifer"}

好像什么都没发生……

以下是我的 pom.xml 文件中列出的依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.0.6</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.0.6</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.0.6</version>
</dependency>

有谁知道我可能做错了什么?

是否有其他库可以使整个过程变得更容易?杰克逊似乎没有工作......

于 2012-12-13T22:18:35.250 回答