当前位置: 首页 > 知识库问答 >
问题:

JSONException:试图从JSON检索数据的问题

段干俊茂
2023-03-14
{"code":200,"status":"OK","data":{"timings":{"Fajr":"04:17","Sunrise":"05:30","Dhuhr":"12:20","Asr":"15:42","Sunset":"19:11","Maghrib":"19:11","Isha":"20:24","Imsak":"04:07","Midnight":"00:20"},"date":{"readable":"17 Jun 2017","timestamp":"1497652236"}}}
 class SaveTheFeed extends AsyncTask<Void, Void, Void>{
    String jsonString = "";
    String result = "";
    EditText chosenCity = (EditText) findViewById(R.id.editText3);
    String city = chosenCity.getText().toString();

    @Override
    protected Void doInBackground(Void... voids) {
        DefaultHttpClient httpClient = new DefaultHttpClient(new BasicHttpParams());
        HttpPost httpPost = new HttpPost("http://api.aladhan.com/timingsByCity?city=" + city + "&country=AE&method=2");
        httpPost.setHeader("Content-type", "application/json");
        InputStream inputStream;

        try{
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            inputStream = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
            StringBuilder builder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) !=null){
                builder.append(line + "\n");
            }
            jsonString = builder.toString();

            JSONObject jObject = new JSONObject(jsonString);

            JSONObject data = (JSONObject) jObject.get("data");

            JSONArray jArray = (JSONArray) data.get("timings");

            outputTimings(jArray);

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOExcepthtml" target="_blank">ion e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }
    @Override
    protected void onPostExecute(Void aVoid) {
        TextView prayerTimes = (TextView) findViewById(R.id.prayerTimes);
        prayerTimes.setText(result);
    }

    protected void outputTimings(JSONArray jsonArray){
        String[] prayers= {"Fajr", "Sunrise", "Dhuhr", "Asr", "Sunset", "Maghrib", "Isha", "Imsak", "Midnight"};
        try{
            for(int i = 0; i < jsonArray.length(); i++){
                JSONObject cityObject =
                        jsonArray.getJSONObject(i);
                result = result +  prayers[i] + " : "+
                         cityObject.getString(prayers[i]) + "\n";
            }

06-17 00:24:15.973 286 6-2907/azanmute.android.com.azanmute W/system.err:org.json.jsonException:java.lang.String类型的值不能转换为JSONObject 06-17 00:24:15.973 286 6-2907/azanmute.android.com.azanmute W/system.err:at org.json.jsemismatch(json.java:111)06-17 00:24:15.973 286 6-2907/azanmute.android.com.typemismatch:15.974 286 6-2907/azanmute.android.com.azanmute W/system.err:at org.json.JSONObject.(JSONObject.java:173)06-17 00:24:15.974 286 6-2907/azanmute.android.com.azanmute W/system.err:at azanmute.android.com.azanmute w/system.err:at azanmute.android.com.azanmute.MainActivity$savethefeed.doinbackground(mainActivity.java:60)06-17 00:24:15.974 286 6-2907/azanmute.android.com.azanmute W/system.err:at android.os.asynctask$2.call(asynctask.java:305)06-17 00:24:15.974 286-29072907/azanmute.android.com.azanmute W/system.err:at java.util.concurrent.futuretask.run(futuretask.java:237)06-17 00:24:15.974 286-2907/azanmute.android.com.azanmute W/system.err:at android.os.asynctask$serialexecutor$1.run(asynctask.java:243)06-17 00:24:15.974 286-2907/azanmute.android.com.azanmute executor.java:1133)06-17 00:24:15.974 286 6-2907/azanmute.android.com.azanmute W/system.err:at java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:607)06-17 00:24:15.974 286 6-2907/azanmute.android.com.azanmute W/system.err:at java.lang.thread.run(thread.java:761)

因此,我的理解是,我错误地指向了数据,或者将JSONObjects与JSONArrays混淆了。我已经尝试了这两个,但仍然收到相同的错误。

共有1个答案

年文柏
2023-03-14

在本例中,您没有混淆JSON对象和JSON数组。这肯定是一个JSONObject。

您可能在字符串中添加了JSONObject构造函数不喜欢的“不可见”字符(即“\n”)。试试这个:

JSONObject jObject = new JSONObject(jsonString.substring(jsonString.indexOf("{"), jsonString.lastIndexOf("}") + 1));

另外,请注意“timings”也是一个JSONObject,而不是JSONArray。JSONArray的示例,其中“CARS”是JSONArray:

{"name":"John","age":30,"cars":[ "Ford", "BMW", "Fiat" ]}
 类似资料:
  • https://en.wikipedia.org/w/api.php?action=query 摘录是一个空字符串

  • 问题内容: 我正在wxPython中编写一个小应用程序,它具有一个matplotlib图形(使用wxagg后端)面板。我想为用户添加将图中当前绘制的X,Y数据导出到文本文件的功能。有无创方法可以做到这一点吗?我已经搜索了很多,似乎什么也找不到,尽管我觉得它非常简单而且就在我的面前。 我绝对可以获取数据,并在绘制数据时将其存储在某个位置,并使用它-但这会侵入我的代码的较低级别。如果我可以做些简单的事

  • 问题内容: 我有以下表格及其关系。我将JSON数据存储在client_services表中。它们是使用MySQL查询来检索JSON值的任何方式,如下所示: 还是可以进一步规范化client_services表? 表: 表: 表: 表: 问题答案: 由于很多人都亲自问过我这个问题,所以我想我会再作一次修改。这是一个具有SELECT,Migration和View Creation的完整SQL的要点,

  • 我有一个用Java编写的管理应用程序,可以管理我的用户 我创建了一个自定义json 这就是我的JSON看起来的样子 在我的列表中,我只显示电子邮件地址 现在我的问题,例如,如果我单击包含电子邮件的列表,我想在对话框中显示与此电子邮件相关的数据,即、和 怎样​​我可以检索其他值吗​​使用电子邮件? 我在网上找不到任何关于它的信息

  • 我是JSON的新手。我想使用JSON检索两个地方之间的距离。我想从位于“legs”数组中的“Distance”对象获取“text”(距离b/w两个地方),而“legs”数组又位于“routes”数组中。链接(http://maps.googleapis.com/maps/api/directions/json?origin=adoor&destination=thiruvananthapuram%

  • 问题内容: 我在从Java servlet内的JavaScript检索以JSON形式发送的数据时遇到查询。以下是我在做什么… 这是JavaScript内向Servlet发出请求的代码的一部分 在发出此请求时,我尝试检索从Servlet中的JavaScript发送的参数,但这样做时,我首先对如何从请求中检索数据感到困惑 我在servlet中使用了以下内容: 注意: 我的Servlet中的内容类型设置