Java 在Android应用程序上接收json代码时,org.json.JSONObject无法转换为JSONArray

Java 在Android应用程序上接收json代码时,org.json.JSONObject无法转换为JSONArray,java,php,android,json,Java,Php,Android,Json,我试图从本地主机PHP文件读取JSON数据。它成功连接,但我得到了错误 05-27 15:40:24.108:E/log_标记(17146):分析数据org.json.JSONException时出错:org.json.JSONObject类型的值{“firstName”:“John”,“lastName”:“Doe”}无法转换为JSONArray 当我在浏览器中打开PHP脚本时,它会成功地显示{“firstName”:“John”,“lastName”:“Doe”} package com.e

我试图从本地主机PHP文件读取JSON数据。它成功连接,但我得到了错误

05-27 15:40:24.108:E/log_标记(17146):分析数据org.json.JSONException时出错:org.json.JSONObject类型的值{“firstName”:“John”,“lastName”:“Doe”}无法转换为JSONArray

当我在浏览器中打开PHP脚本时,它会成功地显示
{“firstName”:“John”,“lastName”:“Doe”}

package com.example.testexternaldatabase;
导入java.io.BufferedReader;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入org.apache.http.HttpEntity;
导入org.apache.http.HttpResponse;
导入org.apache.http.client.HttpClient;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.json.JSONArray;
导入org.json.JSONObject;
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.StrictMode;
导入android.util.Log;
导入android.widget.TextView;
公共类MainActivity扩展了活动{
/**在首次创建活动时调用*/
文本视图结果视图;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
StrictMode.enableDefaults();//已启用严格模式
resultView=(TextView)findViewById(R.id.textView1);
getData();
}
public void getData(){
字符串结果=”;
InputStream isr=null;
试一试{
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(“http://www.mstreetllc.com/Lab.asp“”;//您的PHP
//剧本
//地址
HttpResponse response=httpclient.execute(httppost);
HttpEntity=response.getEntity();
isr=entity.getContent();
}捕获(例外e){
e(“Log_标记”,“http连接错误”+e.toString());
resultView.setText(“无法连接到数据库”);
}
//将响应转换为字符串
试一试{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(
isr,“iso-8859-1”),8);
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
isr.close();
结果=sb.toString();
}捕获(例外e){
Log.e(“Log_标记”,“错误转换结果”+e.toString());
}
//解析json数据
试一试{
字符串s=“”;
JSONArray jArray=新JSONArray(结果);
for(int i=0;i
关于如何解决这个问题,有什么想法吗?谢谢。

您可以这样做:

// parse json data
try {

    String s = "";
    JSONObject json = new JSONObject(result);

    s = s + "First Name : " + json.getString("firstName") + "\n"
                + "Last Name : " + json.getString("lastName") + "\n\n";
    resultView.setText(s);

} catch (Exception e) {
    // TODO: handle exception
    Log.e("log_tag", "Error Parsing Data " + e.toString());
}

您试图将被认为是JSONObject的内容直接转换为JSONArray,这会抛出您得到的错误

JSONObject将分别以括号{和}开始和结束。JSONArray将分别以[和]开始和结束,并用逗号删除,类似于JSONObject中的字段

例如,JSONObject:

{ 
    "firstName":"John", 
    "lastName":"Doe" 
}
{ 
    "the_name_of_your_json_array": [
         { 
              "firstName":"John", 
              "lastName":"Doe" 
          },
         { 
              "firstName":"John", 
              "lastName":"Doe" 
          }
    ]
}
    String s = "";
    JSONObject json = new JSONObject(result);
    s = s + "Name : " + json.getString("name") + "\n" + "Email : " + json.getString("email") + "\n\n";
例如,JSONArray在JSONObject中包含2个原始对象:

{ 
    "firstName":"John", 
    "lastName":"Doe" 
}
{ 
    "the_name_of_your_json_array": [
         { 
              "firstName":"John", 
              "lastName":"Doe" 
          },
         { 
              "firstName":"John", 
              "lastName":"Doe" 
          }
    ]
}
    String s = "";
    JSONObject json = new JSONObject(result);
    s = s + "Name : " + json.getString("name") + "\n" + "Email : " + json.getString("email") + "\n\n";
现在,修复您的代码,因为您只收到一个JSONObject:

{ 
    "firstName":"John", 
    "lastName":"Doe" 
}
{ 
    "the_name_of_your_json_array": [
         { 
              "firstName":"John", 
              "lastName":"Doe" 
          },
         { 
              "firstName":"John", 
              "lastName":"Doe" 
          }
    ]
}
    String s = "";
    JSONObject json = new JSONObject(result);
    s = s + "Name : " + json.getString("name") + "\n" + "Email : " + json.getString("email") + "\n\n";
如果您实际返回一个数据数组(或者如果这是您的意图),它仍将被包装在JSONObject中,并且必须进行如下调整:

    String s = "";
    JSONArray jArray = new JSONObject(result).getJSONArray("the_name_of_your_json_array");
    for (int i = 0; i < jArray.length(); i++) {
        JSONObject json = jArray.getJSONObject(i);
        s = s + "Name : " + json.getString("name") + "\n" + "Email : " + json.getString("email") + "\n\n";
    }

别忘了用你实际使用的任何东西来替换变量名,希望我没有任何注释就足够描述性了。

{“firstName”:“John”,“lastName”:“Doe”}
是一个对象而不是数组吗反正我可以解决这个问题来读取数据吗?使用
新JSONObject(result)
而不是
新JSONArray(result)
@nick:请看它,它在一个页面上解释了您需要了解的关于JSON的几乎所有信息。我这样做时会出错