gpt4 book ai didi

java - Gson中可配置的@SerializedName

转载 作者:行者123 更新时间:2023-11-30 06:47:07 27 4
gpt4 key购买 nike

我可以从配置文件等中获取@SerializedName值吗?

我的意思是:

@SerializedName(value = configProfider.getJsonFieldName())
private String myField

谢谢。

最佳答案

我的评论特别错误:这在 Gson 中是可能的,但对于 @SerializedName (由于 Gson 内部工作方式)和非编译时表达式(由于 Java 限制)则不行。对困惑感到抱歉。 Gson 支持自定义字段命名策略,您可以在配置 Gson 实例时提供该策略。

考虑以下自定义注释:

@Retention(RUNTIME)
@Target(FIELD)
@interface DynamicSerializedName {

String value();

}

现在只需实现您的策略:

final class DynamicSerializedNameStrategy
implements FieldNamingStrategy {

private final Function<? super String, String> translator;

private DynamicSerializedNameStrategy(final Function<? super String, String> translator) {
this.translator = translator;
}

static FieldNamingStrategy getDynamicSerializedNameStrategy(final Function<? super String, String> translator) {
return new DynamicSerializedNameStrategy(translator);
}

@Override
public String translateName(final Field field) {
final DynamicSerializedName annotation = field.getAnnotation(DynamicSerializedName.class);
if ( annotation == null ) {
// Taking the default naming strategy
// @SerializedName takes higher priority in ReflectiveTypeAdapterFactory.Adapter anyway
return FieldNamingPolicy.IDENTITY.translateName(field);
}
final String key = annotation.value();
final String resolvedName = translator.apply(key);
if ( resolvedName == null ) {
throw new IllegalArgumentException("Cannot resolve name by " + key + " for " + field);
}
return resolvedName;
}

}

创建注释:

final class Model {

@DynamicSerializedName("gson.model.field")
final String field = null;

}

如何使用它(基于系统属性的示例):

private static final Gson gson = new GsonBuilder()
.setFieldNamingStrategy(getDynamicSerializedNameStrategy(System::getProperty))
.create();

public static void main(final String... args)
throws IOException {
try ( final Reader reader = getPackageResourceReader(Q43517297.class, "arbitrary.json") ) {
final Model model = gson.fromJson(reader, Model.class);
System.out.println(model.field);
}
}

除非您这样做,否则此示例将失败:

  • 以编程方式定义 gson.model.field 系统属性,如 System.setProperty("gson.model.field", "dynamic");;
  • 或在启动 JVM 时使用 -D 参数定义系统属性:-Dgson.model.field=dynamic

考虑以下 JSON(上面引用为 任意.json):

{
"static": "BY-STATIC-NAME",
"dynamic": "BY-DYNAMIC-NAME"
}

一旦设置了@DynamicSerializedName注释并正确配置了相应的属性,输出将是:

BY-DYNAMIC-NAME

一旦从 DTO 字段中删除 @DynamicSerializedName 注释,或使用 @SerializedName 注释该字段(从 Gson 2.8.0 开始,它具有更高的优先级),输出将是:

BY-STATIC-NAME

关于java - Gson中可配置的@SerializedName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43517297/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com