Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在GSON中需要字符串时如何处理布尔值?_Java_Json_Rest_Api_Gson - Fatal编程技术网

Java 在GSON中需要字符串时如何处理布尔值?

Java 在GSON中需要字符串时如何处理布尔值?,java,json,rest,api,gson,Java,Json,Rest,Api,Gson,我目前正在使用第三方RESTAPI进行开发。我正在为API返回的JSON对象创建对象。我遵循他们的文档,其中说某些变量将是字符串。有时,当没有字符串时,它将返回False。有时,我希望有一个URL,但结果是错误的 我该怎么处理 这就是正在讨论的API 应变对象示例: 在应变对象中,执行搜索时会出现异常。某些搜索结果在注释掉的代码位中使用布尔值而不是字符串/url 有时候我会这样 "genetics": { "names": false, "ucpc

我目前正在使用第三方RESTAPI进行开发。我正在为API返回的JSON对象创建对象。我遵循他们的文档,其中说某些变量将是字符串。有时,当没有字符串时,它将返回False。有时,我希望有一个URL,但结果是错误的

我该怎么处理

这就是正在讨论的API

应变对象示例: 在应变对象中,执行搜索时会出现异常。某些搜索结果在注释掉的代码位中使用布尔值而不是字符串/url

有时候我会这样

"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