- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我可以从配置文件等中获取@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");
;-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/
通常,我使用@SerializedName批注来映射JSON字段。但是,在Google Architecture Component示例项目中,我看到它们使用了@field:SerializedNam
我制作了一个 Bean 类,但是当我运行它时,这会出错。我不知道我该如何解决它。请帮我。 Error:(7, 8) error: cannot find symbol class Serialize
在我的 Android 应用程序中,我定义了太多模型类,并且使用了大写属性名称,如下所示: public String FirstName; public String LastName; 使用此命名
我可以从配置文件等中获取@SerializedName值吗? 我的意思是: @SerializedName(value = configProfider.getJsonFieldName()) pri
在使用 Proguard 的项目中,minifyEnabled true 在使用 Gson 时未正确解析 ApiError 类。 data class ApiResponse( @Serial
我有一个正在序列化以发出请求的对象。 private static final String JSON_REQUEST_ID = "requestId"; private static final S
我有一个 json,我在 Realm 模型中使用 gson 通过注释 @SerializedName 进行转换。 但有时在 json 中,有一个未知的键,我想将其序列化为字符串。 public cla
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我的服务有问题,因为同一字段在请求和响应中的形式不同,因此我使用 @Expose 注释来序列化一个并反序列化另一个: @SerializedName("photo") @Expose(deserial
我正在使用 Retrofit 并且根据 json 有很多 pojo 类。因为我正在使用 Gson 解析,所以我需要使用: @SerializedName("home") private List ho
我有一个包含以下代码的数据类 data class MyBody( @SerializedName("ver") val version: Int, @SerializedName("
Gson 中有没有办法将多个 JSON 字段映射到单个 Java 对象成员变量? 假设我有一个 Java 类... public class MyClass { String id;
不幸的是,我从中提取的 JSON 文件有一个具有相同变量名称的节点,但可能随机具有两种不同的数据类型。当我进行网络调用(使用 gson)时,出现错误: com.google.gson.JsonSynt
我正在使用 com.google.gson.annotations.SerializedName 以及 gson 文档中提到的元素“value”和“alternate”@SerializedName(
我正在根据我的目的改编我在网上找到的一些代码。它正在获取具有列名称(例如“william_henry_harrison”)但使用本地名称(例如“Tippecanoe”)的数据: public clas
这是我使用 Gson 进行序列化的第一种方法。我收到 facebook 对我的 android 应用程序的响应,如下所示: Result: { Response: resp
我有一个带有一些 GSon 注释的 DTO。 我的问题是,如果我的应用程序在开发、暂存或生产中运行,这些注释的值必须改变... 目前,我必须用不同的值打包我的应用程序,我希望它是自动的...它在 Sp
所以我正在尝试使用 Moshi 解析来 self 的服务器的调用。这是我的响应对象。 public class TokenResponse { @SerializedName("accessT
我有这样一个类: class A { @Expose @SerializedName("a_id") private String id; } 现在我想创建扩展 A 的类 B,
关于 Gson,@Expose 和 @SerializedName("stringValue") 有什么区别? 最佳答案 即使为时已晚,我也想回答这个问题。要解释它我们必须知道什么是serializa
我是一名优秀的程序员,十分优秀!