12

Play Frameworkには、PlayモデルをXML / JSONに変換するネイティブまたは推奨の方法がありますか?JAXBまたはJacksonに似たもの。

テンプレートアプローチを推奨する人もいますが、これは非常に冗長であり、整形式のXML/JSONを保証するものではありません。

XMLのPlayドキュメントは、次のように文字列連結を使用して作成されたXML応答を示しています。

return ok("<message \"status\"=\"OK\">Hello " + name + "</message>");

同様に、JSONのPlayドキュメントには、JSONオブジェクトが一度に1行ずつ作成されていることが示されています。

ObjectNode result = Json.newObject();
result.put("status", "OK");
result.put("message", "Hello " + name);

Playを使用してモデルをXML/JSONにシリアル化する標準的な方法はありますか?

このテーマに関する公式のPlayドキュメントはありますか?

4

3 に答える 3

12

簡単な答え: JSONの場合はJacksonXMLの場合はJAXB

Play自体はモデルのマーシャリングに関するドキュメントを提供していませんが、ジョブを実行できるサードパーティのライブラリが付属しています。


JSON:

モデル:

public class User extends Model {
    public String username;
    public Long   age; 

    @JsonIgnore
    public String password; // field won't be marshalled
}

jackson のObjectMapper.writeValueAsString()メソッドを使用して JSON にマーシャリングします。

import org.codehaus.jackson.map.ObjectMapper;
//
ObjectMapper mapper     = new ObjectMapper();
String       jsonString = mapper.writeValueAsString(country);

JSON 出力:

{
    "username" : "John Smith",
    "age"      : "25"
}

XML:

Play が内部でモデルのゲッターとセッターを生成する方法があるため、注意が必要です。コードには getter と setter は表示されませんが、実行時には存在します。

モデルでは、XmlAccessorTypeアノテーションをPROPERTYに設定することが重要です。これにより、基礎となるフィールドからではなく、 getter/setterからシリアル化するように JAXB に指示されます。

@XmlAccessorType(XmlAccessType.PROPERTY)

また、ルート XML ノードの名前を指定する@XmlRootElementアノテーションを追加する必要があります。

@XmlRootElement(name = "UserRoot")

フィールドを省略するには、@XmlTransientアノテーションを getter に追加する必要があります。ソース コードには getter がないため、省略したいフィールドごとに 1 つ追加する必要があります。

@XmlAccessorType(XmlAccessType.PROPERTY)
public class User extends Model {
    public String username;
    public Long   age;

    @JsonIgnore
    public String password;


    @XmlTransient // This means ignore this property
    public String getPassword() {
        return this.password;
    }
}

マーシャリングは、JAXB クラスMarshallerおよびJAXBContextによって実行されます。

JAXBContext context    = JAXBContext.newInstance(User.class);
Marshaller  marshaller = context.createMarshaller();

// Use linefeeds and indentation in the outputted XML
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marshaller.marshal(user, System.out);

出力:

<UserRoot>
    <name>John Smith</name>
    <age>25</age>
</UserRoot>

概要:

Play docs on XMLPlay docs on JSONは json/xmlの操作に関する情報を提供しますが、 Marshallingの実行方法を説明する Play Docs はないようです。そのためには、サードパーティのライブラリとドキュメントを調べる必要があります。

于 2013-02-11T10:17:29.330 に答える
2

JSON については、 @see: Json Docのようにorg.codehaus.jackson利用できるので、 ... を使用することをお勧めします。play.libs.JsonPlay 2/x

For XML- テンプレート アプローチは、ビューで適切な XML をレンダリングできるため、十分に公平です。

編集:

Json と Ebean

悲しいことに、Ebean はオブジェクトを JSON にシリアル化する際に問題があると言わざるを得ません。したがって、私は常に専用の内部クラスを使用しています (Json で送信する必要があるフィールドのみを含むターゲット モデルで)。つまり、Userモデルの場合:

public static class ForJson {
    public Long id;
    public String name;
    public String email;

    public ForJson(User user) {
        this.id = user.id;
        this.name = user.name;
        this.email=user.email;
    }
}

ルート:

GET     /users/all.json            controllers.Application.listUsersJson
GET     /users/all-details.json    controllers.Application.listUsersJsonWithDetails
GET     /users/:id.json            controllers.Application.singleUserJson(id: Long)

行動:

public static Result listUsersJson() {
    List<User.ForJson> usersToJson = new ArrayList<>();
    for (User user : User.find.all()) {
        usersToJson.add(new User.ForJson(user));
    }
    return ok(Json.toJson(usersToJson));
}

public static Result singleUserJson(Long id) {
    User.ForJson userForJson = new User.ForJson(User.find.byId(id));
    return ok(Json.toJson(userForJson));
}

public static Result listUsersJsonWithDetails() {
    Map<String, Object> details = new LinkedHashMap<>();

    List<User.ForJson> usersToJson = new ArrayList<>();
    for (User user : User.find.all()) {
        usersToJson.add(new User.ForJson(user));
    }

    details.put("date", new Date());
    details.put("count", usersToJson.size());
    details.put("users", usersToJson);

    return ok(Json.toJson(details));
}

はい、たぶん冗長なコーディングであることはわかっていますが、少なくとも常に適切な JSON 出力があり、各アクションで 1 行ずつ JSON を作成する必要はありません。.

XML:

HTML char は、デフォルトで Play のテンプレートがそれらをエスケープするため、適切な XML のレンダリングを壊しません。そのため、XML ノード内で,の代わりに<,を使用します:>"&lt;&gt&quot;

<sample>Say &quot;ellou&quot;<sample>

テンプレートのドキュメント(ページの下部)のエスケープ段落を確認してください。

さらに、部分的なテンプレートを使用できます-タグを使用して、単一のアイテムが両方でまったく同じようにフォーマットされることを確認しますusers/1.xml:users/all.xml

于 2013-02-05T21:15:29.620 に答える
1

JSON 変換のより良い方法があります。

User user = new User("...");
String jsonString = Ebean.json().toJson(user);
于 2016-07-26T05:46:42.070 に答える