我是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。我只是一个初学者,所以我真的不明白问题出在哪里。
请求任何帮助。
答案 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));
我希望有所帮助。