- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 google Gson 解析 json 并创建适当的对象:
public class Settings {
@SerializedName("version")
public String version = "1";
@SerializedName("ad_native_enabled")
public boolean nativeAdEnabled = false;
}
问题是我需要知道 nativeAdEnabled
的值实际上是从 json 解析的还是我指定的默认值,即 ad_native_enabled
键是否存在在 json 中,或者不是?我尝试使用 Boolean 而不是 boolean 并仅进行空检查,但 Gson 反序列化失败。这是我的 json 片段:
{
"status": "success",
"ad_native_enabled": false,
}
免责声明
在我的情况下,手动解析 json 并在该级别上进行检测是不相关和优雅的(我想在这种情况下,我必须事先欠我想要的键的列表)去检查)。非常希望以某种方式推断对象级别所需的信息。
我以 boolean 值的示例描述了一个问题,但该问题可能是广义的,并且可能涉及所有原始类型。因此,如果能有一个通用的解决方案来解决这个问题就太好了。
最佳答案
我知道你说过你已经尝试过这个,但是使用 Boolean
字段应该有效。我已经将您的示例缩小了一点,并且它按预期工作。
我定义了Settings
像这样的类:
public static class Settings {
@SerializedName("ad_native_enabled")
public Boolean nativeAdEnabled;
}
如果您随后解析包含该字段的 JSON:
String json = "{\"ad_native_enabled\": false}";
Settings settings = gson.fromJson(json, Settings.class);
System.out.println(settings.nativeAdEnabled); // prints false
如果您解析不包含该字段的 JSON:
String emptyJson = "{}";
Settings emptySettings = gson.fromJson(emptyJson, Settings.class);
System.out.println(emptySettings.nativeAdEnabled); // prints null
您是否将该字段的默认值保留为 false
?如果是这样,第二个示例将打印 false
以及。另外,GSON 似乎并不特别喜欢 JSON 对象中最后一个属性后面的尾随逗号 - 也许这就是您收到错误的原因?
看到您的评论后,我更多地考虑了是否可以以某种方式支持默认值,同时仍然能够判断该字段是否存在于 JSON 中。我能想到的最佳解决方案是引入一种新的包装器类型,并带有自定义反序列化器。
我首先定义了这个包装类型,它只包含字段的实际值,以及该值是否为默认值的指示符:
public static class ValueWrapper<T> {
public final T value;
public final boolean isDefaultValue;
public ValueWrapper(T value, boolean isDefaultValue) {
this.value = value;
this.isDefaultValue = isDefaultValue;
}
}
Settings
类看起来像这样:
public static class Settings {
@SerializedName("ad_native_enabled")
public ValueWrapper<Boolean> nativeAdEnabled = new ValueWrapper<>(false, true);
}
这里我将该字段定义为具有值 false
默认情况下,这就是 isDefaultValue
的原因设置为true
.
然后我为此类型定义了一个自定义反序列化器。基本思想是采用 ValueWrapper
的类型您正在尝试反序列化,提取其泛型参数,将 JSON 中的实际值反序列化为泛型参数类型,然后返回一个新的 ValueWrapper
哪里isDefaultValue
设置为false
。这个解串器看起来像这样:
public static class ValueWrapperDeserializer implements JsonDeserializer<ValueWrapper<?>> {
@Override
public ValueWrapper<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
ParameterizedType parameterizedType = (ParameterizedType) typeOfT;
Type valueType = parameterizedType.getActualTypeArguments()[0];
Object value = context.deserialize(json, valueType);
return new ValueWrapper<>(value, false);
}
}
现在我们需要做的就是注册自定义反序列化器:
Gson gson = new GsonBuilder()
.registerTypeAdapter(ValueWrapper.class, new ValueWrapperDeserializer())
.create();
然后我们可以运行上面的两个示例:
String json = "{\"ad_native_enabled\": false}";
Settings settings = gson.fromJson(json, Settings.class);
System.out.println(settings.nativeAdEnabled.value); // prints false
System.out.println(settings.nativeAdEnabled.isDefaultValue); // prints false
String emptyJson = "{}";
Settings emptySettings = gson.fromJson(emptyJson, Settings.class);
System.out.println(emptySettings.nativeAdEnabled.value); // prints false
System.out.println(emptySettings.nativeAdEnabled.isDefaultValue); //prints true
因此,这允许我们拥有默认值,但仍然能够使用 isDefaultValue
判断该字段是否已设置。 。这显然对Settings
的用户的API产生了相当大的影响。对象,但这也许比处理空值并将默认值存储在其他地方更简洁。
关于java - 判断Json中是否确实存在Gson SerializedName注释的类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33310439/
在有些场景下,我们需要对我们的varchar类型的字段做修改,而修改的结果为两个字段的拼接或者一个字段+字符串的拼接。 如下所示,我们希望将xx_role表中的name修改为name+id。
SELECT incMonth as Month, SUM( IF(item_type IN('typ1', 'typ2') AND incMonth = Month, 1, 0 ) )AS
我最近读到 volatile 字段是线程安全的,因为 When we use volatile keyword with a variable, all the threads read its va
我在一些模型中添加了一个 UUID 字段,然后使用 South 进行了迁移。我创建的任何新对象都正确填充了 UUID 字段。但是,我所有旧数据的 UUID 字段为空。 有没有办法为现有数据填充 UUI
刚刚将我的网站从 mysql_ 更新为 mysqli,并破坏了之前正常运行的查询。 我试图从旋转中提取 id,因为它每次都会增加 1,但我不断获取玩家 id,有人可以告诉我我做错了什么吗?我尝试了将
我在 Mac OS X 上使用带有 Sequel Pro 的 MySQL。我想将一个表中的一个字段(即名为“GAME_DY”的列)复制到另一个名为“DAY_ID”的表的空字段中。两个表都是同一数据库的
问题: 是否有可能有一个字段被 JPA 保留但被序列化跳过? 可以实现相反的效果(JPA 跳过字段而序列化则不会),如果使用此功能,那么相反的操作肯定会很有用。 类似这样的事情: @Entity cl
假设我有一个名为“dp”的表 Year | Month | Payment| Payer_ID | Payment_Recipient | 2008/2009 | July
我将尝试通过我的 Raspberry Pi 接入点保证一些 QoS。 开始之前,我先动手:我阅读了有关 tcp、udp 和 ip header 的内容。在IP header description我看
如果你能弄清楚如何重命名这个问题,我愿意接受建议。 在 Dart 语言中,可以编写一个带有 final 字段的类。这些是只能设置的字段构造函数前 body 跑。这可以在声明中(通常用于类中的静态常量)
你怎么样? 我有两个带有两个字段的日期选择器 我希望当用户选择 (From) 时,第二个字段 (TO) 将是 next day 。比如 booking.com 例如:当用户选择From 01-01-2
我想我已经看到了这个问题的一些答案,这些答案可能与我需要的相差不远,但我对 mysql 的了解还不够确定,所以我会根据我的具体情况提出问题。 我有一个包含多个表的数据库,为此,如果“image”表上的
我在 mySQL 数据库中有 2 个表: customers ============ customer_id (1, 2 ) customer_name (john, mark) orders ==
我正在开发一个员工目标 Web 应用程序。 领导/经理在与团队成员讨论后为他们设定目标。这是一年/半年/季度,具体取决于组织遵循的评估周期。 现在的问题是添加基于时间段的字段或存档上一季度/年度数据的
我正在寻找允许内容编辑器从媒体库中选择多个文件的东西,这些文件将在渲染中列出。他们还需要能够上传文件和搜索。它必须在页面编辑器(版本 8 中称为体验编辑器)中工作。 到目前为止我所考虑的: 一堆文件字
现在,我有以下由 original.df %.% group_by(Category) %.% tally() %.% arrange(desc(n)) 创建的 data.frame。 DF 5),
我想知道是否有一些步骤/解决方案可以处理错误消息并将它们放入 Pentaho 工具中的某个字符串或字段中?例如,如果连接到数据库时发生某些错误,则将该消息从登录到字符串/字段。 最佳答案 我们在作业的
如何制作像短信应用程序一样的“收件人”字段?例如,右侧有一个“+”按钮,当添加某人时,名称将突出显示并可单击,如圆角矩形等。有没有内置的框架? 最佳答案 不,但请参阅 Three20 的 TTMess
是否可以获取记录的元素或字段的列表 通过类型信息类似于类的已发布属性的列表吗? 谢谢 ! 最佳答案 取决于您的delphi版本,如果您使用的是delphi 2010或更高版本,则可以使用“新rtti”
我正在构建一个 SQLite 数据库来保存我的房地产经纪人的列表。我已经能够使用外键来识别每个代理的列表,但我想在每个代理的记录中创建一个列表;从代理商和列表之间的一对一关系转变为一对多关系。 看这里
我是一名优秀的程序员,十分优秀!