运行游戏!使用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
我收到的唯一错误是Unsupported Operation Exception: null
,我在getAsString
以及getAsJsonObject
和getAsJsonPrimitive
知道为什么它在所有方法上都失败了吗?感谢。
答案 0 :(得分:47)
也许您的JsonElement
是JsonNull
您可以做的是首先使用json.isJsonNull
否则,尝试使用json.toString
答案 1 :(得分:41)
我有类似的问题,我不得不将jsonObject.getAsString()更改为jsonObject.toString();
答案 2 :(得分:9)
在我的情况下,我只需要将元素作为空字符串,如果它为null,所以我写了一个这样的函数:
private String getNullAsEmptyString(JsonElement jsonElement) {
return jsonElement.isJsonNull() ? "" : jsonElement.getAsString();
}
所以而不是
val geocoder = json.getAsString
你可以使用这个
val geocoder = getNullAsEmptyString(json);
如果元素为null,则返回“”,如果不是
,则返回实际字符串答案 3 :(得分:0)
对于任何JsonElement
方法,类Unsupported Operation Exception
都将抛出getAs<Type>
,因为它是一个抽象类,并且以这种方式实现是有意义的。
由于某种原因,类JsonObject
无法实现getAs<Type>
方法,因此对这些方法之一的任何调用都会引发异常。
在toString
对象上调用JsonElement
方法,可能会在某些情况下解决您的问题,但可能不是您想要的,因为它将json表示形式返回为String(例如{{1} })。
我发现还存在一个\"value\"
类,它确实实现了JsonPrimitive
方法。因此,正确的处理方式可能是这样的:
getAs<Type>
PS。我删除了所有可空性mgmt部分。如果您使用Java进行编码,则可能希望以更好的方式进行管理。
请参见 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()
}
的GitHub源代码:
https://github.com/google/gson/blob/master/gson/src/main/java/com/google/gson/JsonElement.java#L178