Play framework json serialization

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
}
]
Запись опубликована в рубрике IT. Добавьте в закладки постоянную ссылку.

2 комментария на «Play framework json serialization»

  1. Уведомление: jorge

  2. Уведомление: kenneth

Добавить комментарий

Fill in your details below or click an icon to log in:

Логотип WordPress.com

You are commenting using your WordPress.com account. Log Out / Изменить )

Фотография Twitter

You are commenting using your Twitter account. Log Out / Изменить )

Фотография Facebook

You are commenting using your Facebook account. Log Out / Изменить )

Connecting to %s