一部のオブジェクトを JSON 値として返すために使用renderJSON(Object)
していますが、1 つのフィールドを除いて正常に動作しています。json テンプレート全体を手動で作成することなく、その 1 つのフィールドに追加する簡単な方法はありますか?
7803 次
3 に答える
6
Play は GSON を使用して JSON 文字列を作成します。1 つのフィールドが特定のオブジェクト タイプである場合、そのタイプにカスタマイズされたシリアル化を提供することで、これを簡単に行うことができます。こちらのドキュメントを参照してください
http://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserializ
ただし、たとえば整数クラスの場合、ある方法ではある方法で作業し、別の方法では別の方法で作業したい場合は、もう少し困難になる可能性があります。
例
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(SpecificClass.class, new MySerializer());
private class MySerializer implements JsonSerializer<DateTime> {
public JsonElement serialize(SpecificClass src, Type typeOfSrc, JsonSerializationContext context) {
String res = "special format of specificClass"
return new JsonPrimitive(res);
}
}
于 2010-12-24T07:30:31.280 に答える
2
単純に
JsonElement elem = new Gson().toJsonTree(yourObject);
JsonObject obj = elem.getAsJsonObject();
obj.remove("xxx");
obj.addProperty("xxx", "what you want");
// other stuff ...
renderJSON(obj.toString());
等
于 2011-12-09T13:26:08.267 に答える
0
play フレームワークを評価した後、外部 API 用に JSON をシリアライズするという障害と決定の選択にぶつかりました。多くの記事が play 内で Lift フレームワークを使用することを提案していますが、これは余分なオーバーヘッドのように見えます.play フレームワークでいくつかのフレームワーク/モジュールを試した後、大学と私は、私たちのニーズを満たすことができる軽量のコードブロックを書くことに決めました. .
case class User (
user_id: Int,
user_name: Option[String],
password: Option[String],
salt: Option[String]
) extends Serializable {
def toXml =
<user>
<user_id>{user_id}</user_id>
<user_name>{user_name.getOrElse("")}</user_name>
</user>
override def toJson =
"{" + JSON.key("user_id") + JSON.value(user_id) + ", " + JSON.key("user_name") + JSON.value(user_name) + "}"
}
class Serializable {
def toJson = ""
}
object JSON {
def key(x:String) = value(x) + ": "
def value(x:Any):String = {
x match {
case s:String => "\"" + s + "\""
case y:Some[String] => value(y.getOrElse(""))
case i:Int => value(i.toString)
case s:Serializable => s.toJson
case xs:List[Any] => "[" + xs.map(x => value(x)).reduceLeft(_ + ", " + _) + "]"
}
}
}
def searchUserByName(user_name: String) = {
(for (
u <- Users if u.user_name.like(("%"+user_name+"%").bind)
) yield u.*)
.list
.map(User.tupled(_))
}
def toXml(users:List[User]) = {
<users>
{ users.map(u => u.toXml) }
</users>
}
def toJson(users:List[User]) = {
"[" + users.map(u => u.toJson).reduceLeft(_ + ", " + _) + "]"
}
そしてコントローラーから。
// -- http://localhost:9000/api/users/getUser/xml
// -- http://localhost:9000/api/users/getUser/json
def getUser(requestType:String) = {
db withSession{
val user = Users.byUserName("King.Kong")
if(requestType == "xml") {
Xml(user.toXml)
} else {
user.toJson
}
}
}
//--- http://localhost:9000/api/users/searchuser/xml
//--- http://localhost:9000/api/users/searchuser/json
def searchUser(requestType:String) = {
db withSession{
val users = Users.searchUserByName("Doctor.Spoc")
if(requestType == "xml") {
Xml(Users.toXml(users))
} else {
val jsonList = Users.toJson(users)
Json(jsonList)
}
}
于 2011-12-09T10:10:21.377 に答える