GSON JsonObject“不支持的操作异常:null”获取为字符串

to94eoyn  于 2022-11-06  发布在  其他
关注(0)|答案(5)|浏览(183)

使用Scala运行Play!应用程序。我正在执行一个请求,其中的响应应该是JSON字符串。检查调试器时,JsonElement返回OK,其中包含预期的所有信息。但是,问题是当我尝试在该JsonElement上实际运行方法时。

val json = WS.url("http://maps.googleapis.com/maps/api/geocode/json?callback=?&sensor=true&address=%s", startAddress+","+startCity+","+startProvince).get.getJson
    val geocoder = json.getAsString

我得到的唯一错误是Unsupported Operation Exception: null,并且我已经在getAsStringgetAsJsonObjectgetAsJsonPrimitive上尝试了这个错误
知道为什么所有方法都失败了吗?谢谢。

aelbi1ox

aelbi1ox1#

我遇到了类似的问题,我不得不将jsonObject.getAsString()更改为jsonObject.toString();

3htmauhk

3htmauhk2#

也许你的JsonElement就是JsonNull
您可以首先使用json.isJsonNull检查它是否不正确
否则,尝试使用json.toString获取其字符串表示形式

hgncfbus

hgncfbus3#

在我的例子中,我只需要在元素为null时将其作为空字符串获取,因此我编写了一个如下函数:

private String getNullAsEmptyString(JsonElement jsonElement) {
        return jsonElement.isJsonNull() ? "" : jsonElement.getAsString();
    }

所以与其

val geocoder = json.getAsString

你可以用这个

val geocoder = getNullAsEmptyString(json);

如果元素为空,则返回“”,否则返回实际字符串

vhipe2zx

vhipe2zx4#

要添加到@亨利的回答中.本着Kotlins“OrNull”的精神添加一个扩展函数:

fun JsonElement.asStringOrNull(): String? {
   return if (isJsonNull) null else asString
}
u3r8eeie

u3r8eeie5#

JsonElement将为任何getAs<Type>方法抛出Unsupported Operation Exception,因为它是一个抽象类,并且以这种方式实现是有意义的。
由于某些原因,类JsonObject不实现getAs<Type>方法,因此对这些方法之一的任何调用都将引发异常。
JsonElement对象上调用toString方法,可能会在某些情况下解决您的问题,但可能不是您想要的,因为在某些情况下,它会将json表示返回为String(例如\"value\")。
我发现也存在一个JsonPrimitive类,并且它确实实现了getAs<Type>方法。所以正确的处理方法可能如下:

String input = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
    JsonParser parser = new JsonParser();
    JsonElement jsonTree = parser.parse(input);

    if(jsonTree != null && jsonTree.isJsonObject()) {
        JsonObject jsonObject = jsonTree.getAsJsonObject();
        value = jsonObject.get("key1").getAsJsonPrimitive().getAsString()
    }

PS.我删除了所有的空性管理部分。如果你是用Java编码的,你可能想用更好的方式管理这个。
请参阅JsonElement的GitHub源代码:https://github.com/google/gson/blob/master/gson/src/main/java/com/google/gson/JsonElement.java#L178

相关问题