Play Frameworkを使用して、GSONを介してモデルをシリアル化します。公開するフィールドと公開しないフィールドを指定します。
これはうまく機能しますが、@ exposeメソッドも使用したいと思います。もちろん、これは単純すぎます。
どうすればいいですか?
ご協力いただきありがとうございます !
public class Account extends Model {
@Expose
public String username;
@Expose
public String email;
public String password;
@Expose // Of course, this don't work
public String getEncodedPassword() {
// ...
}
}
この問題で私が得た最善の解決策は、専用のシリアライザーを作成することでした。
public class AccountSerializer implements JsonSerializer<Account> {
@Override
public JsonElement serialize(Account account, Type type, JsonSerializationContext context) {
JsonObject root = new JsonObject();
root.addProperty("id", account.id);
root.addProperty("email", account.email);
root.addProperty("encodedPassword", account.getEncodedPassword());
return root;
}
}
そして、私の見解では、このように使用するには:
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(Account.class, new AccountSerializer());
Gson parser = gson.create();
renderJSON(parser.toJson(json));
しかし、@Expose
メソッドの作業は素晴らしいでしょう:メソッドを表示するためだけにシリアライザーを作成することは避けられます!
Gson on Fireをチェックしてください: https://github.com/julman99/gson-fire
これは私が作成したライブラリであり、Gsonを拡張して、公開メソッド、結果のポストシリアル化、ポストデシリアル化など、Gsonで時間をかけて必要としていた多くのケースを処理します。
このライブラリは、当社のContactive( http://goo.gl/yueXZ )の本番環境で、AndroidとJavaバックエンド
Gsonの@Expose
はフィールドでのみサポートされているようです。これに登録されている問題があります: @ Exposeはメソッドで使用する必要があります 。
Cyrilの答えに基づいてさまざまなオプションを組み合わせます。
ショートカット付きのカスタムシリアライザー:
public static class Sample
{
String firstName = "John";
String lastName = "Doe";
public String getFullName()
{
return firstName + " " + lastName;
}
}
public static class SampleSerializer implements JsonSerializer<Sample>
{
public JsonElement serialize(Sample src, Type typeOfSrc, JsonSerializationContext context)
{
JsonObject tree = (JsonObject)new Gson().toJsonTree(src);
tree.addProperty("fullName", src.getFullName());
return tree;
}
}
public static void main(String[] args) throws Exception
{
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(Sample.class, new SampleSerializer());
Gson parser = gson.create();
System.out.println(parser.toJson(new Sample()));
}
-OR-アノテーションベースのシリアライザー
public static class Sample
{
String firstName = "John";
String lastName = "Doe";
@ExposeMethod
public String getFullName()
{
return firstName + " " + lastName;
}
}
public static class MethodSerializer implements JsonSerializer<Object>
{
public JsonElement serialize(Object src, Type typeOfSrc, JsonSerializationContext context)
{
Gson gson = new Gson();
JsonObject tree = (JsonObject)gson.toJsonTree(src);
try
{
PropertyDescriptor[] properties = Introspector.getBeanInfo(src.getClass()).getPropertyDescriptors();
for (PropertyDescriptor property : properties)
{
if (property.getReadMethod().getAnnotation(ExposeMethod.class) != null)
{
Object result = property.getReadMethod().invoke(src, (Object[])null);
tree.add(property.getName(), gson.toJsonTree(result));
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
return tree;
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) //can use in method only.
public static @interface ExposeMethod {}
public static void main(String[] args) throws Exception
{
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(Sample.class, new MethodSerializer());
Gson parser = gson.create();
System.out.println(parser.toJson(new Sample()));
}
http://camelcode.org/tutorial/[email protected]
package org.camelcode;
import com.google.gson.annotations.Expose;
public class Book {
@Expose
private String author;
@Expose
private String title;
private Integer year;
private Double price;
public Book() {
this("camelcode.org", "Exclude properties with Gson", 1989, 49.55);
}
public Book(String author, String title, Integer year, Double price) {
this.author = author;
this.title = title;
this.year = year;
this.price = price;
}
}
package org.camelcode;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class WriteGson {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
String json = gson.toJson(new Book());
System.out.println(json);
Gson gsonNonExcluded = new Gson();
String jsonNonExcluded = gsonNonExcluded.toJson(new Book());
System.out.println(jsonNonExcluded);
}
}
{"author":"camelcode.org","title":"Exclude properties with Gson"}
{"author":"camelcode.org","title":"Exclude properties with Gson","year":1989,"price":49.55}