【问题标题】:Error reading Json Array in Android在 Android 中读取 Json 数组时出错
【发布时间】:2018-04-29 23:28:45
【问题描述】:

JSON

{
"data": [{
    "id": "0bfe9470-4a57-11e8-8594-9fed6c4fe65b",
    "type": 6,
    "order": 12,
    "data": {
        "goto": "+",
        "type": 6,
        "order": 12,
        "options": [{
            "display": "P\u00e9ssimo"
        }, {
            "display": "Ruim"
        }, {
            "display": "Regular"
        }, {
            "display": "Bom"
        }, {
            "display": "\u00d3timo"
        }],
        "required": true,
        "answer": []
    }
}, {
    "id": "0594b030-4a57-11e8-8c83-0d7c6461d799",
    "type": 5,
    "order": 10,
    "data": {
        "type": 5,
        "order": 10,
        "options": {
            "left": {
                "goto": "+",
                "display": 0
            },
            "right": {
                "goto": "+",
                "display": 100
            },
            "center": {
                "goto": "+",
                "display": 50
            }
        },
        "required": true,
        "answer": []
    }
}, {
    "id": "00f8dea0-4a57-11e8-ab0b-7b5c52826681",
    "type": 4,
    "order": 9,
    "data": {
        "type": 4,
        "order": 9,
        "options": [{
            "items": [{
                "goto": "+",
                "display": "Bom"
            }, {
                "goto": "+",
                "display": "Regular"
            }, {
                "goto": "+",
                "display": "Ruim"
            }],
            "display": "Thiago Silva"
        }, {
            "items": [{
                "goto": "+",
                "display": "Bom"
            }, {
                "goto": "+",
                "display": "Regular"
            }, {
                "goto": "+",
                "display": "Ruim"
            }],
            "display": "Thiago Silva"
        }],
        "required": true,
        "answer": []
    }
}]
}

代码 - PageReports 添加

public class PageReports implements Serializable{

    @SerializedName("data")
    @Expose
    private List<Datum> data = null;

    public List<Datum> getData() {
        return data;
    }

    public void setData(List<Datum> data) {
        this.data = data;
    }

}

private void getReportPages(String id) {
    if (subscription != null) {
        subscription.unsubscribe();
    }
    subscription = RxUtil.appleHandlerStartFinish(
            RestBuilder.api().getReportPage(RestParams.authHeaderAccept(getContext()), id),
            () -> base.displayProcess(),
            () -> base.dismissProcess())
            .compose(RxUtil.applySchedulers())
            .subscribe(
                    pageReports -> {
                       // LogUtil.e("JSON: ", SuApp.getInstance().gson().toJson(pageReports));
                        if (pageReports != null && pageReports.getData() != null && pageReports.getData().size() > 0) {
                            currentDataReport.setDataPages(pageReports.getData());
                            viewPager.setOffscreenPageLimit(pageReports.getData().size());
                            mPagerAdapter = new ReportPagerAdapter(getChildFragmentManager(), pageReports.getData());
                            viewPager.setAdapter(mPagerAdapter);
                            indicator.setViewPager(viewPager);
                        }
                    },
                    throwable -> throwable.printStackTrace()
            );
}

public static Map<String,String> authHeaderAccept(Context context) {
    Map<String, String> header = defaultHeader();
    header.put("Authorization","Bearer " + Preference.getInstance(context).getToken());
    return header;
}

错误

W/System.err: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 125 path $.data[0].data.options
W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
                  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
                  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
                  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
                  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
                  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 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
                  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
                  at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
                  at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
                  at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:122)
                  at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:217)
W/System.err:     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.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
                  at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230)
                  at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
                  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                  at java.lang.Thread.run(Thread.java:818)
              Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 125 path $.data[0].data.options
W/System.err:     at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
                  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)
                ... 28 more

我正在尝试读取但总是出错,如果我在 JSON 中只有一个值,我可以进行搜索,但是当它有 3 时它没有。

好像 GSON () 类没有转换。在这种情况下可以做些什么以使错误不再发生?更改 JSON 还是代码中存在我尚未识别的错误?

【问题讨论】:

  • 乍一看,您似乎在尝试将 JSON 直接加载到对象中,而 JSON 在 Java 对象没有数组的位置包含一个数组。您能否确定第 1 行第 125 列中的哪个字段并对照您的 Java 对象定义进行检查?
  • @Hugg 请发布您的pageReports 型号代码
  • @Kulebin 代码添加
  • 这并不能真正告诉我们任何事情。正如 Gewure 指出的那样(我在错误中遗漏了),问题出在“选项”元素上:第一个 Datum 将 this 作为数组,第二个只是一个对象。这意味着我们需要查看 options 字段,这意味着您发布的仅包含 Datum 对象的 PageReports 也意味着没有 Datum 也没有任何意义,如果选项位于另一个包含的对象中,那么查看它会很有用也。但希望你现在已经足够了:听起来 JSON 中第一个 Datum 中的数组是错误的。需要同时接受array + obj吗?
  • @Rup.现在我明白错误了,谢谢。

标签: java android arrays json android-studio


【解决方案1】:

您的第二个data 对象丢失[ 和后来的] options

"options": {
        "left": {
            "goto": "+",

不管什么原因..

做这个

"options": [{
            "left": {
                "goto": "+",

..并在末尾使用相应的 ] 关闭数组

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2013-09-26
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多