1

Java 6、Tomcat 7、Jersey 1.15、Jackson 1.9.9 を使用して、次のアーキテクチャを持つ単純な Web サービスを作成しました。

私の POJO (モデル クラス):

Family.java:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Family {

    private String father;
    private String mother;

    private List<Children> children;

    // Getter & Setters
}

Children.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;
    }
}

MyWebService:

@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

Family を返す代わりに、String を返すこともできます (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 に答える