Настройка сериализации JSON в Play - PullRequest
1 голос
/ 23 декабря 2010

Я использую renderJSON(Object), чтобы вернуть некоторые объекты в виде значений JSON, и он работает нормально, за исключением одного поля. Есть ли простой способ добавить это поле без необходимости вручную создавать весь шаблон json?

Ответы [ 3 ]

6 голосов
/ 24 декабря 2010

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);
  }
}
2 голосов
/ 09 декабря 2011

Просто сделайте

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

и т. Д.

0 голосов
/ 09 декабря 2011

После оценки игровой среды мы наткнулись на камень преткновения и выбор решения о сериализации JSON для внешнего API. Во многих статьях предлагается использовать 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)
    }



  }
...