使用com.fasterxml.jackson.databind.ObjectMapper序列化接口字段

时间:2017-06-15 14:01:01

标签: java json serialization jackson

在json结果中序列化? 如何在json结果中序列化或填充接口。我使用com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(obj)。

json结果中未显示的接口字段



    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
    @JsonSubTypes({ 
        @Type(value = TranslateEN.class, name = "en"),
        @Type(value = TranslatePT.class, name = "pt")
    })
    public interface ITranslate extends Serializable {

        String app = "Anota Ai";

    }

    @XmlRootElement
    public final class TranslatePT implements ITranslate {

        private static final long serialVersionUID = 1L;

        private static TranslatePT instance;

        private TranslatePT() {
            super();
        }

        static {
            instance = new TranslatePT();
        }

        public static TranslatePT getInstance() {
            return instance;
        }

        public final Message message = new Message();
        public final Entidade entidade = new Entidade();

        final static class Message {
            public final String defultError = "Erro inesperado";
        }

        final static class Login {
            public final String forbidden = "Sessão expirada, favor efetuar o login novamente.";
            public final String confirmacaoSenha = "A senha não confere com a confirmação de senha. Informe novamente.";
        }

        final static class Entidade {
            public final EntidadeDeletada editada = new EntidadeDeletada();
        }

        final static class EntidadeDeletada {
            public final String sucesso = "{0} editada com sucesso.";
        }

    }


    public class MessageSerialize {

        @Test
        public void loadHtmlFileTest() throws IOException {
            ObjectMapper objectMapper = new ObjectMapper();
            TranslatePT instanceTranslate = TranslatePT.getInstance();
            String dtoAsString = objectMapper.writeValueAsString(instanceTranslate);
            Assert.assertNotNull(dtoAsString);
        }

    }
    //result of serialization
    {"type":"pt","message":{"defultError":"Erro inesperado"},"entidade":{"editada":{"sucesso":"{0} editada com sucesso."}}}

2 个答案:

答案 0 :(得分:2)

接口中的app变量不是实例字段,而是常量。接口中的字段隐式public static final

常量与类关联,它们不是实例的一部分。 Jackson只将对象实例序列化为JSON,因此不会序列化静态。

答案 1 :(得分:2)

正如Luciano所指出的那样(隐含地),即使你使用适当的注释,静态字段也不会被杰克逊序列化。但是,Jackson默认会调用它找到的所有getter方法,并将返回值放在JSON中,并使用从getter名称派生的字段名称。因此,如果必须序列化静态字段app,只需在类中放置名为getApp的getter方法,在本例中为TranslatePT

public String getApp() {
    return app;
}