java – GSON将Integer转换为特定字段的动态布尔值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – GSON将Integer转换为特定字段的动态布尔值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4504字,纯文字阅读大概需要7分钟。
内容图文
![java – GSON将Integer转换为特定字段的动态布尔值](/upload/InfoBanner/zyjiaocheng/797/5c05a859f9b8442e9d5523c71d21180e.jpg)
如何处理字段相同的名称但不同的类型.我有时得到整数值有时在同一请求中来自api的布尔值.我想知道如何让Json像这样处理.我创建了类型适配器,但它不起作用
我想创建不同的pojo类.但是这个问题不仅仅针对一个请求.因此我不喜欢创造pojos.顺便说一下,我看到了类似的问题,但它并没有解决我的问题.
{
"name" : "john doe",
"isValid" : true
}
有时我得到int
{
"name" : "john doe",
"isValid" : 1
}
获取整数时,我得到意外的json异常
class XModel{
private boolean isValid;
...
...
}
我想为每个请求返回布尔值.有谁知道如何解决这个问题?
编辑:
我想通过Type Adapter阻止instanceOf关键字
解决方案:@Micha?Ziober的回复对我有用.
class BooleanJsonDeserializer implements JsonDeserializer<Boolean> {
private final Set<String> TRUE_STRINGS = new HashSet<>(Arrays.asList("true", "1", "yes"));
@Override
public Boolean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
System.out.println(json);
JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
if (jsonPrimitive.isBoolean()) {
return jsonPrimitive.getAsBoolean();
} else if (jsonPrimitive.isNumber()) {
return jsonPrimitive.getAsNumber().intValue() == 1;
} else if (jsonPrimitive.isString()) {
return TRUE_STRINGS.contains(jsonPrimitive.getAsString().toLowerCase());
}
return false;
}
}
解决方法:
如果XModel类不大,您可以编写自定义反序列化器,如下所示,您可以控制传入元素:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class GsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
Gson gson = new GsonBuilder()
.registerTypeAdapter(XModel.class, new XModelJsonDeserializer())
.create();
System.out.println(gson.fromJson(new FileReader(jsonFile), XModel.class));
}
}
class XModelJsonDeserializer implements JsonDeserializer<XModel> {
private final Set<String> TRUE_STRINGS = new HashSet<>(Arrays.asList("true", "1", "yes"));
@Override
public XModel deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
XModel response = new XModel();
JsonObject jsonResponse = (JsonObject) json;
response.setName(jsonResponse.get("name").getAsString());
// other fields
JsonElement dataElement = jsonResponse.get("isValid");
if (dataElement.isJsonNull()) {
response.setValid(false);
} else if (dataElement.isJsonPrimitive()) {
JsonPrimitive jsonPrimitive = dataElement.getAsJsonPrimitive();
if (jsonPrimitive.isBoolean()) {
response.setValid(jsonPrimitive.getAsBoolean());
} else if (jsonPrimitive.isNumber()) {
response.setValid(jsonPrimitive.getAsNumber().intValue() == 1);
} else if (jsonPrimitive.isString()) {
response.setValid(TRUE_STRINGS.contains(jsonPrimitive.getAsString()));
}
System.out.println("Json data is primitive: " + dataElement.getAsString());
} else if (dataElement.isJsonObject() || dataElement.isJsonArray()) {
response.setValid(true); //?!?!
}
return response;
}
}
对于以下JSON有效负载:
{
"name" : "john doe",
"isValid" : true
}
以上程序打印:
Json data is primitive: true
XModel{name='john doe', isValid=true}
对于JSON有效负载:
{
"name" : "john doe",
"isValid" : 1
}
打印:
Json data is primitive: 1
XModel{name='john doe', isValid=true}
您的模型很清楚,因为所有工作都是在解串器级别完成的.
一点点精确的解决方案是仅序列化原语.我们假设模型如下所示:
class XModel {
private String name;
@JsonAdapter(value = BooleanJsonDeserializer.class)
private boolean isValid;
// getters, setters
}
我们的BooleanJsonDeserializer反序列化器如下所示:
class BooleanJsonDeserializer implements JsonDeserializer<Boolean> {
private final Set<String> TRUE_STRINGS = new HashSet<>(Arrays.asList("true", "1", "yes"));
@Override
public Boolean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
System.out.println(json);
JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
if (jsonPrimitive.isBoolean()) {
return jsonPrimitive.getAsBoolean();
} else if (jsonPrimitive.isNumber()) {
return jsonPrimitive.getAsNumber().intValue() == 1;
} else if (jsonPrimitive.isString()) {
return TRUE_STRINGS.contains(jsonPrimitive.getAsString().toLowerCase());
}
return false;
}
}
您只需要在模型中使用此适配器注释每个布尔属性,它就可以处理:1,True等.
内容总结
以上是互联网集市为您收集整理的java – GSON将Integer转换为特定字段的动态布尔值全部内容,希望文章能够帮你解决java – GSON将Integer转换为特定字段的动态布尔值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。