如何从属性文件访问gson serializedname注解值

nbysray5  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(321)

我正在尝试将我的json字符串反序列化到我的自定义类,我想将@serializedname注解值作为可配置参数进行访问,该参数应读取应用程序属性文件中的值。我提供了以下代码段,但它接受一个常量字符串,是否有其他方法使这些参数可配置

{
  FName: "Sample",
  LName: "LName"}

 class Test{

@SerializedName(value=${"${name}"})
    private string name;
@SerializedName(value=${"${data}"})
    private string data;
}

application.properties file
name=FName
data=LName
nr7wwzry

nr7wwzry1#

gson不知道有任何其他图书馆,除非你告诉它这样做(为什么要为你可能永远不会使用的东西付费?)。您可以使用的自定义实现在gson提供的基础上扩展gson FieldNamingStrategy 接口:

public final class ValueFieldNamingStrategy
        implements FieldNamingStrategy {

    private final Environment environment;

    private ValueFieldNamingStrategy(final Environment environment) {
        this.environment = environment;
    }

    public static FieldNamingStrategy of(final Environment environment) {
        return new ValueFieldNamingStrategy(environment);
    }

    @Override
    public String translateName(final Field f) {
        @Nullable
        final Value valueAnnotation = f.getAnnotation(Value.class);
        if ( valueAnnotation == null ) {
            return f.getName();
        }
        return environment.resolvePlaceholders(valueAnnotation.value());
    }

}
public final class ValueFieldNamingStrategyTest {

    @org.junit.jupiter.api.Test
    public void test()
            throws IOException {
        final ConfigurableEnvironment configurableEnvironment = new StandardEnvironment();
        final MutablePropertySources propertySources = configurableEnvironment.getPropertySources();
        final PropertySource<?> propertySource = new MapPropertySource("test", ImmutableMap.of(
                "name", "FName",
                "data", "LName"
        ));
        propertySources.addLast(propertySource);
        final FieldNamingStrategy unit = ValueFieldNamingStrategy.of(configurableEnvironment);
        final Gson gson = new GsonBuilder()
                .disableHtmlEscaping()
                .disableInnerClassSerialization()
                .setFieldNamingStrategy(unit)
                .create();
        try ( final JsonReader jsonReader = /*...open JSON reader here...*/ ) {
            final Test test = gson.fromJson(jsonReader, Test.class);
            Assertions.assertEquals("FName", test.name);
            Assertions.assertEquals("LName", test.data);
        }
    }

    private static final class Test {

        @Value("${name}")
        private String name;

        @Value("${data}")
        private String data;

    }

}

相关问题