3

私はシリアライゼーションにFlexJsonを使用しています。唯一の問題は、大文字で始まる必要があるのに、フィールド名が小文字で生成されることです。

class Person
{
     String name;
     public String getName() { return name;}
}

シリアル化すると、フィールドは としてシリアル化されますがname、必要な場合は ですName

出力フィールド名を指定するにはどうすればよいですか? 必要なシリアライゼーション名を指定するために設定できる属性はありますか?

4

1 に答える 1

5

これは、カスタム トランスフォーマーを使用して実現できます。Flexjson ページ トランスフォーマーは次のとおりです。

渡されたオブジェクトを JSON に変換する方法を決定し、JSONContext オブジェクトを適切に呼び出して JSON を出力し、変換プロセスに沿ってオブジェクトを渡します。

Flexjson は、この目的のために抽象クラスAbstractTransformerを提供しています。transform(Object object)自分で変換を処理するには、拡張およびオーバーライドします。

FieldNameTransformer以下に貼り付けたのは、フィールド名 s を手動で指定するために私が書いたコードです。

public class FieldNameTransformer extends AbstractTransformer {
    private String transformedFieldName;

    public FieldNameTransformer(String transformedFieldName) {
        this.transformedFieldName = transformedFieldName;
    }

    public void transform(Object object) {
        boolean setContext = false;

        TypeContext typeContext = getContext().peekTypeContext();

        //Write comma before starting to write field name if this
        //isn't first property that is being transformed
        if (!typeContext.isFirst())
            getContext().writeComma();

        typeContext.setFirst(false);

        getContext().writeName(getTransformedFieldName());
        getContext().writeQuoted(object.toString());

        if (setContext) {
            getContext().writeCloseObject();
        }
    }

    /***
     * TRUE tells the JSONContext that this class will be handling 
     * the writing of our property name by itself. 
     */
    @Override
    public Boolean isInline() {
        return Boolean.TRUE;
    }

    public String getTransformedFieldName() {
        return this.transformedFieldName;
    }
}

このカスタム トランスフォーマーの使用方法は次のとおりです。

JSONSerializer serializer = new JSONSerializer().transform(new FieldNameTransformer("Name"), "name");

元のフィールドの名前は「名前」ですが、json 出力では名前に置き換えられます。

サンプリング:

{"Name":"Abdul Kareem"}
于 2012-01-16T11:52:27.010 に答える