web-dev-qa-db-ja.com

GSonを使用してメソッドを公開する方法は?

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() {
        // ...
    }
}
22
Cyril N.

この問題で私が得た最善の解決策は、専用のシリアライザーを作成することでした。

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メソッドの作業は素晴らしいでしょう:メソッドを表示するためだけにシリアライザーを作成することは避けられます!

22
Cyril N.

Gson on Fireをチェックしてください: https://github.com/julman99/gson-fire

これは私が作成したライブラリであり、Gsonを拡張して、公開メソッド、結果のポストシリアル化、ポストデシリアル化など、Gsonで時間をかけて必要としていた多くのケースを処理します。

このライブラリは、当社のContactive( http://goo.gl/yueXZ )の本番環境で、AndroidとJavaバックエンド

12
julman99

Gsonの@Expose はフィールドでのみサポートされているようです。これに登録されている問題があります: @ Exposeはメソッドで使用する必要があります

6
Jonas

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

}
4
craigrs84

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}
0
Ran Adler