簡體   English   中英

在Play中自定義JSON序列化

[英]Customizing JSON serialization in Play

我正在使用renderJSON(Object)返回一些對象作為JSON值,除了一個字段,它工作正常。 有沒有一種簡單的方法可以在該字段中添加內容而無需手動創建整個json模板?

Play使用GSON構建JSON字符串。 如果您的字段是一種特定的對象類型,則可以通過為該類型提供自定義的序列化來輕松完成此操作。 請參閱此處的文檔

http://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserializ

但是,例如,如果它是一個Integer類,而您想以一種方式工作,而又以另一種方式工作,那么您可能會遇到一些困難。

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);
  }
}

只需做一個

JsonElement elem = new Gson().toJsonTree(yourObject);
JsonObject obj = elem.getAsJsonObject();
obj.remove("xxx");
obj.addProperty("xxx", "what you want"); 
// other stuff ... 
renderJSON(obj.toString());

等等

在評估了游戲框架之后,我們遇到了絆腳石,並決定了為外部API序列化JSON。 那里的所有文章都建議在游戲中使用Lift框架,這似乎是額外的開銷。在嘗試了一些在游戲框架中使用過的框架/模塊后,一所大學和我自己決定編寫一個輕巧的代碼塊來滿足我們的需求。

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)
    }



  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM