【问题标题】:GSON JsonObject "Unsupported Operation Exception: null" getAsStringGSON JsonObject“不支持的操作异常:null”getAsString
【发布时间】:2012-03-08 15:31:24
【问题描述】:

运行游戏!使用 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,我已经在 getAsStringgetAsJsonObjectgetAsJsonPrimitive 上尝试过这个

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

【问题讨论】:

    标签: scala playframework gson


    【解决方案1】:

    也许你的JsonElementJsonNull

    你可以做的是首先检查它不是使用json.isJsonNull

    否则,尝试使用json.toString 获取其字符串表示

    【讨论】:

    • 是的,成功了,没想到会有好的 ole null。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 查看github repo,似乎getAsString()方法还没有实现。无论如何,它只会抛出不受支持的异常。 github.com/google/gson/blob/master/gson/src/main/java/com/…
    • 我相信这是因为 getAsString() 函数应该将根元素的子属性作为字符串返回,而不是根元素本身。如果您有一个 json,例如 {"foo":{"bar":"foobar"}},那么调用 json.get("foo").getAsString() 将返回字符串 {"bar":"foobar"}。
    【解决方案3】:

    在我的情况下,如果元素为空,我只需要将元素作为空字符串获取,所以我编写了一个这样的函数:

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

    所以不是

    val geocoder = json.getAsString
    

    你可以用这个

    val geocoder = getNullAsEmptyString(json);
    

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

    【讨论】:

      【解决方案4】:

      添加到@Henry 的答案。本着 Kotlins 的“OrNull”精神添加扩展功能:

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

      【讨论】:

        【解决方案5】:

        JsonElement 类将针对任何getAs<Type> 方法抛出Unsupported Operation Exception,因为它是一个抽象类并且以这种方式实现是有意义的。

        由于某种原因,JsonObject 类没有实现 getAs<Type> 方法,因此对这些方法之一的任何调用都会引发异常。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-26
          • 1970-01-01
          • 2021-11-21
          • 1970-01-01
          • 2021-11-05
          相关资源
          最近更新 更多