Scala “GSON JsonObject”;不受支持的操作异常:null";getAsString

Scala “GSON JsonObject”;不受支持的操作异常:null";getAsString,scala,playframework,gson,Scala,Playframework,Gson,上演一出戏!应用程序与Scala。我正在执行一个请求,其中响应应该是JSON字符串。检查调试器时,JsonElement返回OK,并按预期提供所有信息。然而,问题是当我试图在该JsonElement上实际运行方法时 val json = WS.url("http://maps.googleapis.com/maps/api/geocode/json?callback=?&sensor=true&address=%s", startAddress+","+startCity+","

上演一出戏!应用程序与Scala。我正在执行一个请求,其中响应应该是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
我得到的唯一错误是
不支持的操作异常:null
,我在
getAsString
getAsJsonObject
getAsJsonPrimitive


知道为什么所有方法都失败了吗?谢谢。

也许您的
jsonement
是一个
JsonNull

您可以首先使用
json.isJsonNull


否则,请尝试使用
json.toString

获取其字符串表示形式。我遇到了类似的问题,必须将
jsonObject.getAsString()
更改为
jsonObject.toString()

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

private String getNullAsEmptyString(JsonElement jsonElement) {
        return jsonElement.isJsonNull() ? "" : jsonElement.getAsString();
    }
    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()
    }
所以不是

val geocoder = json.getAsString
你可以用这个

val geocoder = getNullAsEmptyString(json);

如果元素为null,则返回“”;如果元素不为null,则返回实际字符串。对于任何
getAs
方法,类
JsonElement
将抛出
不支持的操作异常,因为它是一个抽象类,以这种方式实现是有意义的

由于某种原因,类
JsonObject
没有实现
getAs
方法,因此对其中一个方法的任何调用都会引发异常

JsonElement
对象上调用
toString
方法可能会在某些情况下解决您的问题,但可能不是您想要的,因为在某些情况下,它会将json表示形式返回为字符串(例如
\“value\”

我发现还存在一个
JsonPrimitive
类,它实现了
getAs
方法。所以正确的方法可能是这样的:

private String getNullAsEmptyString(JsonElement jsonElement) {
        return jsonElement.isJsonNull() ? "" : jsonElement.getAsString();
    }
    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()
    }
另外,我删除了所有可空性管理部分。如果您使用Java编写代码,您可能希望以更好的方式管理它

参见GitHub源代码了解
JsonElement

是的,成功了,我们并不期待好的ole null。谢谢查看github repo,似乎还没有实现getAsString()方法。不管发生什么,它都会抛出不受支持的异常。我认为这是因为getAsString()函数应该以字符串的形式返回根元素的子属性,而不是根元素本身。如果您有一个json,比如{“foo”:{“bar”:“foobar”},那么调用json.get(“foo”).getAsString()将返回字符串{“bar”:“foobar”}。