JSON Parser在JSONArray中没有价值

时间:2015-06-20 10:45:18

标签: java android asp.net json web-services

我是webservice和JSON的新手,只是说。 我使用ASP.NET Web API来连接SQL Server和我的Android应用程序,但是当我到达解析点时,我得到了一个"没有价值的值"错误和应用程序崩溃。

以下是webservice中查询的代码,它返回一个填充了服务器中元素的DataTable

    public DataTable Tagmap() 
    {
        DataTable deptTable = new DataTable();
        deptTable.Columns.Add("no", typeof(String));
        deptTable.Columns.Add("name", typeof(String));

        if (dbConnection.State.ToString() == "Closed")
        {
            dbConnection.Open();
        }

        string query = "SELECT COUNT(R_NOME), R_NOME FROM RUBRICHEUTENTI GROUP BY R_NOME";

        SqlCommand command = new SqlCommand(query, dbConnection);
        SqlDataReader reader = command.ExecuteReader();

        if (reader.HasRows)
        {
            while (reader.Read())
            {
                deptTable.Rows.Add(reader["no"], reader["name"]);
            }
        }

        reader.Close();
        dbConnection.Close();
        return deptTable;
    }

以下是Android应用程序上的DataTable代码

public class DeptTable {

int no;
String name;

public DeptTable(int no, String name) {
    super();
    this.no = no;
    this.name = name;
}

public DeptTable() {
    super();
    this.no=0;
    this.name = null;
}


public int getNo() {
    return no;
}
public void setNo(int no) {
    this.no = no;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

这是调用解析方法的Activity

public class DeptActivity extends Activity {

ArrayAdapter<String> adapter;
ListView listv;
Context context;
ArrayList<String> data;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dept);
    // Show the Up button in the action bar.
    //setupActionBar();
    data = new ArrayList<String>();
    listv = (ListView) findViewById(R.id.lv_dept);
    context = this;

    adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, data);
    listv.setAdapter(adapter);
    Toast.makeText(this,"Attendi...",Toast.LENGTH_SHORT).show();
    new AsyncLoadDeptDetails().execute();

}

protected class AsyncLoadDeptDetails extends
        AsyncTask<Void, JSONObject, ArrayList<DeptTable>> {
    ArrayList<DeptTable> deptTable = null;

    @Override
    protected ArrayList<DeptTable> doInBackground(Void... params) {
        // TODO Auto-generated method stub


        RestAPI api = new RestAPI();
        try {

            JSONObject jsonObj = api.Tagmap();

            JSONParser parser = new JSONParser();

            deptTable = parser.parseDepartment(jsonObj);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            //Log.d("AsyncLoadDeptDetails", e.getMessage());
            e.printStackTrace();
        }

        return deptTable;
    }

    @Override
    protected void onPostExecute(ArrayList<DeptTable> result) {
        // TODO Auto-generated method stub

        for (int i = 0; i < result.size(); i++)
        {
            data.add(result.get(i).getNo() + " " + result.get(i).getName());

        }
        adapter.notifyDataSetChanged();

        Toast.makeText(context,"Loading Completed",Toast.LENGTH_SHORT).show();
    }

}

/**
 * Set up the {@link android.app.ActionBar}, if the API is available.
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void setupActionBar() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.dept, menu);
    return true;
}

最后是解析方法本身,我在JSONArray中得到错误jsonArray = object.getJSONArray(&#34; Value&#34;);然后在OnPostExecute级联

public ArrayList<DeptTable> parseDepartment(JSONObject object)
{
    ArrayList<DeptTable> arrayList=new ArrayList<DeptTable>();
    try {
        JSONArray jsonArray=object.getJSONArray("Value");
        JSONObject jsonObj=null;
        for(int i=0;i<jsonArray.length();i++)
        {
            jsonObj=jsonArray.getJSONObject(i);
            arrayList.add(new DeptTable(jsonObj.getInt("no"), jsonObj.getString("name")));
        }


    } catch (JSONException e) {
        // TODO Auto-generated catch block
        //Log.d("JSONParser => parseDep", e.getMessage());
        e.printStackTrace();
    }
    return arrayList;
}

我不知道要改变什么,我试图在arrayList.add上放一个optJSONArray或optInt / optString但是我得到一个nullpointerException。我只是一个初学者,所以我真的不明白问题出在哪里。

请求任何帮助。

2 个答案:

答案 0 :(得分:0)

这可能是您在此构造函数中为值赋值null的问题:

public DeptTable() {
    super();
    this.no=0;
    this.name = null;
}

答案 1 :(得分:0)

看起来DataTable Tagmap()中的查询列不匹配。

string query = "SELECT COUNT(R_NOME), R_NOME FROM RUBRICHEUTENTI GROUP BY R_NOME";

您的列名似乎无效。你有“不”和“名字”栏吗?如果是,那可能就是这种情况。尝试这样的简单查询:

SELECT no,name FROM YOUR_TABLE

另请注意,“no”是整数,因此您可以更改此内容:

 DataTable deptTable = new DataTable();
    deptTable.Columns.Add("no", typeof(String));
    deptTable.Columns.Add("name", typeof(String));

到此:

 DataTable deptTable = new DataTable();
    deptTable.Columns.Add("no", typeof(int));
    deptTable.Columns.Add("name", typeof(String));

我希望有所帮助。