When we create a REST api, we need to manage json representation (for example what fields can be serialized and what fields we can skip). In play framework we cannot do this with default json serializer. Of course, we can use another serializer: FlexJson, or create view file with json extension and put all arguments here:
Controller:
public static void index() {
renderArgs.put("id", 1);
renderArgs.put("name", "John Doe");
renderTemplate("Application/index.json");
}
/views/Application/index.json
{
"id": "${id}",
"name": "${name}"
}
Another solution is create own serializator using exclusion strategy with gson builder. For first we create package serialization, and class BaseController. All our application controller extends this class.
JsonExclude.java
package serialization;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface JsonExclude {
// model fields marked with this annotation
// will not be include to json serialization
}
JsonExcludeStrategy.java
package serialization;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
public class JsonExclusionStrategy implements ExclusionStrategy {
@Override
public boolean shouldSkipClass(Class cls) {
return false;
}
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getAnnotation(JsonExclude.class) != null;
}
}
JsonRenderer.java
package serialization;
import play.exceptions.UnexpectedException;
import play.mvc.Http.Request;
import play.mvc.Http.Response;
import play.mvc.results.Result;
import com.google.gson.GsonBuilder;
public class JsonRenderer extends Result {
String json;
public JsonRenderer(Object o) {
GsonBuilder gson = new GsonBuilder();
gson.setExclusionStrategies(new JsonExclusionStrategy()).serializeNulls();
json = gson.create().toJson(o);
}
public JsonRenderer(String jsonString) {
json = jsonString;
}
@Override
public void apply(Request request, Response response) {
try {
setContentTypeIfNotSet(response, "application/json; charset=utf-8");
response.out.write(json.getBytes("utf-8"));
} catch (Exception e) {
throw new UnexpectedException(e);
}
}
}
BaseController.java
package controllers;
import play.mvc.Controller;
import serialization.JsonRenderer;
public class BaseController extends Controller {
protected static void JsonEncode(Object o) {
throw new JsonRenderer(o);
}
protected static void JsonEncode(String jsonString) {
throw new JsonRenderer(jsonString);
}
}
User.java
package models;
...
@Entity
@Table(name="Users")
public class User extends Model {
@SerializedName("user")
public String name;
public String email;
@JsonExclude
public String password;
@JsonExclude
public boolean isAdmin;
...
}
Application.java (controller)
package controllers;
...
public class Application extends BaseController {
...
public static void index() {
JsonEncode(User.findAll());
}
...
}
This output all fields without JsonExclude annotation.
[
{
"user": "John Doe",
"email": "john@gmail.com",
"id": 1
},
{
"user": "Frank Harrison",
"email": "fh@gmail.com",
"id": 2
}
]
Уведомление: jorge
Уведомление: kenneth