Изменить имя свойства с помощью Flexjson - PullRequest
3 голосов
/ 04 октября 2011

Я использую FlexJson для сериализации, единственная проблема в том, что он генерирует имена полей в нижнем регистре, а мне нужно, чтобы они начинались с верхнего регистра:

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

При сериализации поле сериализуется как name, хотя мне нужно, чтобы оно было Name.

Как мне указать имя выходного поля?Могу ли я указать какой-либо атрибут, чтобы указать требуемое имя сериализации?

1 Ответ

5 голосов
/ 16 января 2012

Вы можете достичь этого, используя Custom Transformer . Согласно 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");

, где имя исходного поля равно 'name', но в выводе json оно будет заменено на Name.

Образец:

{"Name":"Abdul Kareem"}
...