org.json.JSONArray 无法转换为 JSONObject 错误。

4
我已经尝试了2天来修复这个错误,从stackoverflow.com上搜索并尝试了多种编码类型。我已经检查了我的JSON http://jsonformatter.curiousconcept.com/#jsonformatter。但是我仍然无法找出为什么我的代码会这样做。我有3个文件。MainActivity.java应该从我的服务器上的test.json文件中获取信息,然后将其处理到Events.java。Events.java只显示信息,但应用程序没有到达那里。
如果其他人需要修复此问题,请使用更新的代码。
我的错误:
 01-14 22:18:08.165: E/JSON Response:(419): > { "event":[ 
    01-14 22:18:08.165: E/JSON Response:(419):      {
    01-14 22:18:08.165: E/JSON Response:(419):       "event_name":"Test Event",
    01-14 22:18:08.165: E/JSON Response:(419):       "event_time":"7:00pm",
    01-14 22:18:08.165: E/JSON Response:(419):       "event_price":"$15.00"
    01-14 22:18:08.165: E/JSON Response:(419):      }
    01-14 22:18:08.165: E/JSON Response:(419):   ] 
    01-14 22:18:08.165: E/JSON Response:(419): }
    01-14 22:18:08.175: E/Json Error(419): Error: org.json.JSONException: Value         [{"event_price":"$15.00","event_time":"7:00pm","event_name":"Test Event"}] at event of type     org.json.JSONArray cannot be converted to JSONObject 

MainActivity.java

package com.example.dba;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity 
{

String event_name, event_time, event_price;
static JSONObject object =null;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new PrefetchData().execute();
}

/**
 * Async Task to make http call
 */
private class PrefetchData extends AsyncTask<Void, Void, Void> 
{

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();      
    }

    @Override
    protected Void doInBackground(Void... arg0) 
    {

        JsonParser jsonParser = new JsonParser();
        String json = jsonParser.getJSONFromUrl("http://www.website/test.json");

        Log.e("JSON Response: ", "> " + json);

        if (json != null) 
        {
           try 
            {
                JSONObject parent = new JSONObject(json);
                JSONArray eventDetails = parent.getJSONArray("event");

                for(int i=0; i < eventDetails.length(); i++)
                {
                    object = eventDetails.getJSONObject(i);
                    event_name = object.getString("event_name");
                    event_time = object.getString("event_time");
                    event_price = object.getString("event_price");

                    Log.e("JSON", "> " + event_name + event_time + event_price );
                }
            }  catch (JSONException e) 
                {
                Log.e("Json Error", "Error: " + e.toString());
                    e.printStackTrace();
                }

        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) 
    {           
        super.onPostExecute(result);

        Intent i = new Intent(MainActivity.this, Events.class);
        i.putExtra("event_name", event_name);
        i.putExtra("event_time", event_time);
        i.putExtra("event_price", event_price);
        startActivity(i);

        // close this activity
        finish();
    }

}

}


}

这个错误意味着你正在尝试将一个 JSON 数组(如 [1,2,3])转换为一个 JSON 对象(如 {"field":"value"})。你知道触发这个错误的代码行是哪一行吗? - user2684301
3个回答

4
你从服务器获取了一个JSON数组,并试图将其转换为JsonObject。
而不是:
JSONObject obj = new JSONObject(string);

应该做什么?

JSONArray obj = new JSONArray(string);

我们都知道,JSONArray表示数组,JSONObject表示对象。因此,

代表数组,{代表对象。

try 

    {
            JSONArray jObj = new JSONArray(json);
//other code
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

3

需要更改的相关代码-在MainActivity.javadoInBackground()中:

JSONObject eventDetails = parent.getJSONObject("event");

to:

JSONArray eventDetails = parent.getJSONArray("event");

这基本上就是我所做的,然后我添加了一个带有静态对象的for循环。现在我正在从我的服务器获取JSON。感谢快速响应。 object = eventDetails.getJSONObject(i); event_name = object.getString("event_name"); event_time = object.getString("event_time"); event_price = object.getString("event_price"); - Jayce

0

你的代码只解析了Json对象而没有解析Json数组的值。

要解析Json对象:

jsonobject = JSONfunctions.getJSONfromURL("URL Here");

从JsonObjects解析JsonArray:

jsonarray = jsonobject.getJSONArray("Object name here");

在你的代码中更改这个。
JSONObject parent = new JSONObject(json);
JSONObject eventDetails = parent.getJSONObject("event");

转为

JSONObject parent = new JSONObject(json);
JSONArray eventDetails = parent.getJSONArray("event");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接