9

シリアル化の目的でGSONを使用していますが、フィールドの値に基づいてGsonが提供するExclusionStrategyクラスに基づいて、シリアル化から特定のフィールドを除外する方法が見つかりません。これは、最上位クラスまたはフィールド属性ベースの除外のみをサポートしているためです。フィールド属性には、そのフィールドの値は含まれません。だから私は何をすべきですか?

4

3 に答える 3

22

これを実現する方法は、問題のクラスのカスタム シリアライザーを作成することです。Gson がデフォルトの方法で JSON オブジェクトを作成できるようにした後、その値に基づいて除外するプロパティを削除します。

public class SerializerForMyClass implements JsonSerializer<MyClass> {  

    @Override
    public JsonElement serialize(MyClass obj, Type type, JsonSerializationContext jsc) {
        Gson gson = new Gson();
        JsonObject jObj = (JsonObject)gson.toJsonTree(obj);   
        if(obj.getMyProperty()==0){
            jObj.remove("myProperty");
        }
        return jObj;
    }
}

そして、このクラスのアプリケーションでシリアル化に使用する Gson オブジェクトに新しいシリアライザーを登録します。

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(MyClass.class, new SerializerForMyClass());
Gson gson=gsonBuilder.create();
gson.toJson(myObjectOfTypeMyClass);
于 2012-10-29T11:01:42.567 に答える
0

すべての false ブール値とすべての「false」文字列を削除するために作成したクラスの詳細な例を次に示します。すぐに組み立てられましたが、問題なく動作しているようです。見つけたバグがあれば教えてください。

public class RemoveFalseJsonSerializer implements JsonSerializer<Object> {

//~ Methods --------------------------------------------------------------------------------------------------------

/**
 * serialize
 *
 * @param object in value
 * @param type in value
 * @param jsonSerializationContext in value
 *
 * @return out value
 */
@Override
public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonSerializationContext) {
    Gson gson = new Gson();
    JsonElement jsonElement = gson.toJsonTree(object);
    trimJson(jsonElement);
    return jsonElement;
}

/**
 * We've finally made it to a primitive of some sort.  Should we trim it?
 *
 * @param jsonElement in value
 *
 * @return out value
 */
private boolean shouldTrimElement(JsonElement jsonElement) {
    return jsonElement == null || jsonElement.isJsonNull()
            || (jsonElement.isJsonPrimitive()
                && ((jsonElement.getAsJsonPrimitive().isBoolean() && !jsonElement.getAsBoolean()) // trim false
                    || (jsonElement.getAsJsonPrimitive().isString() // also trim the string "false"
                        && "false".equalsIgnoreCase(jsonElement.getAsString()))));
}

/**
 * trimJson
 *
 * @param jsonElement in value
 */
private void trimJson(JsonElement jsonElement) {
    if (jsonElement == null || jsonElement.isJsonNull() || jsonElement.isJsonPrimitive()) {
        return;
    }

    if (jsonElement.isJsonObject()) {
        List<String> toRemove = new ArrayList<>();
        JsonObject asJsonObject = jsonElement.getAsJsonObject();
        for (Map.Entry<String, JsonElement> jsonElementEntry : asJsonObject.entrySet()) {
            if (jsonElementEntry.getValue().isJsonObject() || jsonElementEntry.getValue().isJsonArray()) {
                trimJson(jsonElementEntry.getValue());
            } else if (shouldTrimElement(jsonElementEntry.getValue())) {
                toRemove.add(jsonElementEntry.getKey());
            }
        }
        if (CollectionUtils.isNotEmpty(toRemove)) {
            for (String remove : toRemove) {
                asJsonObject.remove(remove);
            }
        }
    } else if (jsonElement.isJsonArray()) {
        JsonArray asJsonArray = jsonElement.getAsJsonArray();
        for (JsonElement element : asJsonArray) {
            trimJson(element);
        }
    }
}
}
于 2016-04-07T18:50:25.523 に答える