java - Android - 错误 java.lang.UnsupportedOperationException : JsonNull

标签 java android json nullpointerexception retrofit

我正在尝试在我的应用程序中使用 JSON 字符串、Retrofit 和其他东西。但是在这个特定的模型中,有些东西使我的 JSON 字符串为空。

这是我反序列化字符串的方法:

public static class TaskGSON implements JsonSerializer<Task>, JsonDeserializer<Task>{

    @Override
    public Task deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
      System.out.println(json.toString());
      if (!json.isJsonNull()) {
        final JsonObject jsonObject = json.getAsJsonObject();
        Task t = new Task();
        t.mId = jsonObject.get(NAMES.Server.ID).getAsString();
        t.mProjectId = jsonObject.get(NAMES.Server.PROJECT_ID).getAsString();
        t.mTitle = jsonObject.get(NAMES.Server.TITLE).getAsString();
        t.mPriority = Priority.deSerialize(jsonObject.get(NAMES.Server.PRIORITY).getAsString());
        t.mCreatedAt = context.deserialize(jsonObject.get(NAMES.Server.CREATED_AT), Date.class);
        t.mCreatedById = jsonObject.get(NAMES.Server.CREATED_BY_ID).getAsString();
        t.mUpdatedAt = context.deserialize(jsonObject.get(NAMES.Server.UPDATED_AT), Date.class);
        t.mFeedCount = jsonObject.get(NAMES.Server.FEED_COUNT).getAsInt();
        t.mPermissions = context.deserialize(jsonObject.get(NAMES.Server.PERMISSIONS), new TypeToken<List<Permission>>() {}.getType());

        if (jsonObject.has(NAMES.Server.COLLECTION_ID)) {
          t.mCollectionId = jsonObject.get(NAMES.Server.COLLECTION_ID).getAsString();
        }

        if (jsonObject.has(NAMES.Server.DESCRIPTION)) {
          t.mDescription = jsonObject.get(NAMES.Server.DESCRIPTION).getAsString();
        }
        if (jsonObject.has(NAMES.Server.DUE_DATE) && !jsonObject.get(NAMES.Server.DUE_DATE).isJsonNull()) {
          t.mDueDate = context.deserialize(jsonObject.get(NAMES.Server.DUE_DATE), Date.class);
        }

        if (jsonObject.has(NAMES.Server.COMPLETED_AT)) {
          t.mCompletedAt = context.deserialize(jsonObject.get(NAMES.Server.COMPLETED_AT), Date.class);
        }

        if (jsonObject.has(NAMES.Server.COMPLETED_BY_ID)) {
          t.mCompletedById = jsonObject.get(NAMES.Server.COMPLETED_BY_ID).getAsString();
        }

        if (jsonObject.has(NAMES.Server.DELETED_AT)) {
          t.mDeletedAt = context.deserialize(jsonObject.get(NAMES.Server.DELETED_AT), Date.class);
        }

        if (jsonObject.has(NAMES.Server.COMPLETED)) {
          t.mCompleted = jsonObject.get(NAMES.Server.COMPLETED).getAsBoolean();
        }

        if (jsonObject.has(NAMES.Server.CHECKLIST)) {
          t.mChecklists = context.deserialize(jsonObject.get(NAMES.Server.CHECKLIST), new TypeToken<List<Checklist>>() {}.getType());
        }

        if (jsonObject.has(NAMES.Server.ATTACHMENTS)) {
          t.mAttachments = context.deserialize(jsonObject.get(NAMES.Server.ATTACHMENTS), new TypeToken<List<Attachment>>() {}.getType());
        }

        if (jsonObject.has(NAMES.Server.MARKERS)) {
          t.mMarkers = context.deserialize(jsonObject.get(NAMES.Server.MARKERS), new TypeToken<List<Marker>>() {}.getType());
        }
        if (jsonObject.has(NAMES.Server.CATEGORY_ID)) {
         t.mCategory = jsonObject.get(NAMES.Server.CATEGORY_ID).getAsString();
        }

        return t;
      } else {
        return null;
      }
    }

所以,问题是,当我注释检查我的 JSON 字符串中是否有字段“description”和“categoryId”的代码行时,我没有收到错误,但是如果我取消注释这些 if 语句,我会收到错误说Json为空。我不知道为什么。

这是完整的 logcat:
09-22 17:02:57.890 21172-26613/com.construct.test E/AbstractEntitiesViewModel: Error java.lang.UnsupportedOperationException: JsonNull
   at com.google.gson.JsonElement.getAsString(JsonElement.java:191)
   at com.construct.v2.models.entities.task.Task$TaskGSON.deserialize(Task.java:740)
   at com.construct.v2.models.entities.task.Task$TaskGSON.deserialize(Task.java:717)
   at com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:69)
   at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
   at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
   at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
   at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
   at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
   at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:119)
   at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:218)
   at retrofit2.OkHttpCall.execute(OkHttpCall.java:180)
   at retrofit2.adapter.rxjava.CallExecuteOnSubscribe.call(CallExecuteOnSubscribe.java:40)
   at retrofit2.adapter.rxjava.CallExecuteOnSubscribe.call(CallExecuteOnSubscribe.java:24)
   at retrofit2.adapter.rxjava.BodyOnSubscribe.call(BodyOnSubscribe.java:36)
   at retrofit2.adapter.rxjava.BodyOnSubscribe.call(BodyOnSubscribe.java:28)
   at rx.Observable.unsafeSubscribe(Observable.java:10256)
   at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)
   at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)
   at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
   at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
   at rx.Observable.unsafeSubscribe(Observable.java:10256)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:248)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:148)
   at rx.internal.operators.OnSubscribeFromArray$FromArrayProducer.fastPath(OnSubscribeFromArray.java:76)
   at rx.internal.operators.OnSubscribeFromArray$FromArrayProducer.request(OnSubscribeFromArray.java:58)
   at rx.Subscriber.setProducer(Subscriber.java:211)
   at rx.internal.operators.OnSubscribeFromArray.call(OnSubscribeFromArray.java:32)
   at rx.internal.operators.OnSubscribeFromArray.call(OnSubscribeFromArray.java:24)
   at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
   at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
   at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
   at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
   at rx.Observable.unsafeSubscribe(Observable.java:10256)
   at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
   at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
   at java.lang.Thread.run(Thread.java:761)

字段描述和类别都可以为空,但它们存在于我的 Json 中。这很奇怪,因为当我评论这些行时它工作得很好。

最佳答案

您应该从 yourJsonObject.getAsString() 更改至yourJsonObject.toString()

关于java - Android - 错误 java.lang.UnsupportedOperationException : JsonNull,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46372540/

相关文章:

c# - 将 C# 脚本解析为 Java

android - 监听 LineLayer 上的点击事件

java - Android 私钥到 BouncyCaSTLe PrivateKeyInfo?

json - 在 JQ 中按正则表达式过滤

javascript - 自动完成 onselect 事件打开链接

python - 如何从复杂的 JSON API 返回嵌套值

java - 清理后 Maven 不编译。 "cannot find symbol"

java - 在 Java 中如何解决从重载方法中选择的歧义?

java - 在准备另一个Statement之前是否需要关闭PreparedStatement

java - 如何清除一个变量(数组列表列表)而不无意中清除另一个变量?