【问题标题】:Can't cast JsonNull to JsonObject无法将 JsonNull 转换为 JsonObject
【发布时间】:2012-09-11 23:42:57
【问题描述】:

我想将一个原始属性从一个 JsonObject 复制到另一个

JsonObject propertyToBeCopied = source.getAsJsonObject(propertyName);

但我总是遇到这个异常:

com.google.gson.JsonNull cannot be cast to com.google.gson.JsonObject

根据文档,应该可以进行演员表,还是我错了?

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    根据docsJsonNullJsonElement 但不是JsonObject(它本身就是JsonElement)。使用

    JsonElement element = source.get(propertyName);
    if (!(element instanceof JsonNull)) {
        JsonObject propertyToBeCopied = (JsonObject) element;
    }
    

    如果不是 JsonNull 类型,则将返回一个转换为 JsonObjectJsonElement

    【讨论】:

    • 谢谢。我现在正在使用:destination.add("attribute", source.get("attribute"));
    • 需要注意的一点 - 您必须在 instanceof 检查或 !不会编译。 if(!(element instanceof JsonNull))...
    【解决方案2】:
    JsonElement element = source.get(propertyName);
    if (!(element.isJsonNull())) {
        JsonObject propertyToBeCopied = (JsonObject) element;
    }
    

    isJsonNull 或使用 instanceOf 运算符,哪一个会有更好的性能?

    【讨论】:

      【解决方案3】:

      根据API referenceJsonNull 派生自JsonElement不是 JsonObject,所以我看不出该演员阵容如何有效。

      您是否考虑过使用json-simple 代替gson?作为一般规则,我发现它比其他 json 框架更方便,尽管它当然没有 gson 提供的很多额外功能。但是,如果您使用 gson 所做的只是解析 json,则可能值得切换到更简单的库。

      【讨论】:

      • 线程已经很老了,但供将来参考:json-simple 不再维护并且有很多突出的错误(例如处理BigDecimals 等)所以它不再是一个好的选择
      【解决方案4】:

      如果输出没有响应数组,那么有可能会引发此错误。

      JsonObject playListObject = (JsonObject) parser.parse(output);
      
      JsonArray playListInformationArray = playListObject.getAsJsonArray("Response");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-30
        • 2012-12-12
        • 2015-12-02
        • 1970-01-01
        相关资源
        最近更新 更多