Java 在GSON中需要字符串时如何处理布尔值?
我目前正在使用第三方RESTAPI进行开发。我正在为API返回的JSON对象创建对象。我遵循他们的文档,其中说某些变量将是字符串。有时,当没有字符串时,它将返回False。有时,我希望有一个URL,但结果是错误的 我该怎么处理 这就是正在讨论的API 应变对象示例: 在应变对象中,执行搜索时会出现异常。某些搜索结果在注释掉的代码位中使用布尔值而不是字符串/url 有时候我会这样Java 在GSON中需要字符串时如何处理布尔值?,java,json,rest,api,gson,Java,Json,Rest,Api,Gson,我目前正在使用第三方RESTAPI进行开发。我正在为API返回的JSON对象创建对象。我遵循他们的文档,其中说某些变量将是字符串。有时,当没有字符串时,它将返回False。有时,我希望有一个URL,但结果是错误的 我该怎么处理 这就是正在讨论的API 应变对象示例: 在应变对象中,执行搜索时会出现异常。某些搜索结果在注释掉的代码位中使用布尔值而不是字符串/url 有时候我会这样 "genetics": { "names": false, "ucpc
"genetics": {
"names": false,
"ucpc": false,
"link": false
}
有时候我可以得到这个
"genetics": {
"names": "Blueberry x Haze",
"ucpc": "W74AFGH22Z000000000000000 x 9XVU7WJQCD000000000000000",
"link": "https:\/\/www.cannabisreports.com\/api\/v1.0\/strains\/9XVU7PTG2P000000000000000\/genetics"
}
由于您已经知道将有一个
布尔值
或字符串
,因此可以直接获得一个
原语值可以是字符串、Java原语或Java原语包装类型
然后从JsonPrimitive
实例中,您可以检查它是否正确
下面是如何在一个小片段中使用它
public static String getURL(JsonObject json, String value){
JsonPrimitive data = json.get(value).getAsJsonPrimitive();
if(data.isBoolean()){
return "Boolean : " + data.getAsBoolean();
} else {
return "String : " + data.getAsString();
}
}
这里有一个快速的例子来验证这个逻辑
public static void main(String[] args) {
String data =
"{"
+ " \"element\" : {"
+ " \"a\":false,"
+ " \"b\":\"foobar\""
+ " }"
+ "}";
JsonObject json = new JsonParser().parse(data).getAsJsonObject();
JsonObject element = json.get("element").getAsJsonObject();
System.out.println(getURL(element, "a"));
System.out.println(getURL(element, "b"));
}
布尔值:false字符串:foobar
使用的json:
{
"element" :{
"a":false,
"b":"foobar"
}
}
由于您已经知道将有一个
布尔值
或字符串
,因此可以直接获得一个
原语值可以是字符串、Java原语或Java原语包装类型
然后从JsonPrimitive
实例中,您可以检查它是否正确
下面是如何在一个小片段中使用它
public static String getURL(JsonObject json, String value){
JsonPrimitive data = json.get(value).getAsJsonPrimitive();
if(data.isBoolean()){
return "Boolean : " + data.getAsBoolean();
} else {
return "String : " + data.getAsString();
}
}
这里有一个快速的例子来验证这个逻辑
public static void main(String[] args) {
String data =
"{"
+ " \"element\" : {"
+ " \"a\":false,"
+ " \"b\":\"foobar\""
+ " }"
+ "}";
JsonObject json = new JsonParser().parse(data).getAsJsonObject();
JsonObject element = json.get("element").getAsJsonObject();
System.out.println(getURL(element, "a"));
System.out.println(getURL(element, "b"));
}
布尔值:false字符串:foobar
使用的json:
{
"element" :{
"a":false,
"b":"foobar"
}
}
当您遇到设计不太好的API的麻烦时,Gson在反序列化此类API生成的JSON文档时为您提供了一些灵活性。尽管您有很多方法来解决这个问题(比如
JsonDeserializer
等等),但您通常都会遇到我在这里已经看到的false as null问题。您可以通过标记“错误”字段来帮助Gson:
最终类信封{
最终遗传学=空;
@凌驾
公共字符串toString(){
返回MoreObjects.toStringHelper(此)
.add.(“遗传学”,遗传学)
.toString();
}
}
final class遗传学{
@JsonAdapter(FalseAsNullTypeAdapterFactory.class)
最终字符串名称=null;
@JsonAdapter(FalseAsNullTypeAdapterFactory.class)
最终字符串ucpc=null;
@JsonAdapter(FalseAsNullTypeAdapterFactory.class)
最终URL链接=null;
@凌驾
公共字符串toString(){
返回MoreObjects.toStringHelper(此)
.添加(“名称”,名称)
.添加(“ucpc”,ucpc)
添加(“链接”,链接)
.toString();
}
}
下面是类型适配器工厂的实现方式:
最终类FalseAsNullTypeAdapterFactory
实现TypeAdapterFactory{
//不用担心,Gson将自己实例化它
私有FalseAsNullTypeAdapterFactory(){
}
@凌驾
公共类型适配器创建(最终Gson Gson、最终TypeToken TypeToken){
final-TypeAdapter-delegateAdapter=gson.getAdapter(typeToken);
返回新的TypeAdapter(){
@凌驾
公共无效写入(最终JsonWriter out,最终T值)
抛出IOException{
delegateAdapter.write(out,value);
}
@凌驾
公共T读(最终JsonReader in)
抛出IOException{
//如果下一个标记是布尔值
if(in.peek()==JsonToken.BOOLEAN){
//这是真的
if(在.nextBoolean()中){
//然后报告一个意外的“真”字
抛出新的MalformedJsonException(“预期空值指示符为'false`.“+in”);
}
//如果它是假的,那么我们假设它是空的
返回null;
}
//否则,像往常一样读取整个值
返回delegateAdapter.read(in);
}
};
}
}
反序列化问题中提供的JSON文档后,toString
-ed映射可能会产生如下结果:
Envelope{genetics=Genetics{names=null, ucpc=null, link=null}}
Envelope{genetics=Genetics{names=Blueberry x Haze, ucpc=W74AFGH22Z000000000000000 x 9XVU7WJQCD000000000000000, link=https://www.cannabisreports.com/api/v1.0/strains/9XVU7PTG2P000000000000000/genetics}}
当您遇到设计不太好的API的麻烦时,Gson在反序列化此类API生成的JSON文档时为您提供了一些灵活性。尽管您有很多方法来解决这个问题(比如
JsonDeserializer
等等),但您通常都会遇到我在这里已经看到的false as null问题。您可以通过标记“错误”字段来帮助Gson:
最终类信封{
最终遗传学=空;
@凌驾
公共字符串toString(){
返回MoreObjects.toStringHelper(此)
.add.(“遗传学”,遗传学)
.toString();
}
}
final class遗传学{
@JsonAdapter(FalseAsNullTypeAdapterFactory.class)
最终字符串名称=null;
@JsonAdapter(FalseAsNullTypeAdapterFactory.class)
最终字符串ucpc=null;
@JsonAdapter(FalseAsNullTypeAdapterFactory.class)
最终URL链接=null;
@凌驾
公共字符串toString(){
返回MoreObjects.toStringHelper(此)
.添加(“名称”,名称)
.添加(“ucpc”,ucpc)
添加(“链接”,链接)
.toString();
}
}
下面是类型适配器工厂的实现方式:
最终类FalseAsNullTypeAdapterFactory
实现TypeAdapterFactory{
//不用担心,Gson将自己实例化它
私有FalseAsNullTypeAdapterFactory(){
}
@凌驾
公共类型适配器创建(最终Gson Gson、最终TypeToken TypeToken){
final-TypeAdapter-delegateAdapter=gson.getAdapter(typeToken);
返回新的T