1

我想从作为服务器中 servlet 响应的字符串创建 json 对象。

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

    public JSONObject getJSONFromUrl(String url,String a) {

        ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
        postParameters.add(new BasicNameValuePair("branchname", a));

        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            httppost.setEntity(new UrlEncodedFormEntity(postParameters));

            HttpResponse httpResponse = httpClient.execute(httppost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();          

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }


        return jObj;            
}}

这是我的小服务程序..

public class AvailabilityResponse extends HttpServlet {

@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    PrintWriter out=response.getWriter();

        String br_id;
        br_id=request.getParameter("branchname");

    try{
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                Connection con=DriverManager.getConnection("jdbc:mysql://localhost:8888  /atmlivedetails","root","root");  
        Statement st=con.createStatement();
        ResultSet rs=st.executeQuery("select atmbrno, atmbrname  from location_stat where act_brname='"+br_id+"'");
        int i=0;
        JSONArray jArray = new JSONArray();
        while(rs.next()){

    String s = rs.getString("atmbrno");
    String t = rs.getString("atmbrname");

    JSONObject arrayObj = new JSONObject();

    arrayObj.put("atmbrno",s);
    arrayObj.put("atmbrname",t);

    jArray.add(i,arrayObj);
    i++;
    }
    rs.close ();
    st.close ();
    out.print(jArray);
}

    catch(Exception e){
            out.print(e);
    }


}}

但是当我运行它时它说错误

"parsing data org.json.JSONException: Value [{"atmbrname":"ANURADAPURA
[ATM 2]","atmbrno":"ATM084"},{"atmbrname":"MANNAR BRANCH  
","atmbrno":"ATM344"}] of type org.json.JSONArray cannot be converted
to JSONObject"

在这种情况下有什么问题?

这是我的呼叫课程

public class ListAtmActivity extends ListActivity{

private static String url ="http://10.0.2.2:8080/hello/AvailabilityResponse";

//TextView error;
//String brName;

//Bundle b = getIntent().getExtras();
//String brName = b.getString("key");

private static final String TAG_CONTACTS = "contacts";
private static final String TAG_ID = "id";
private static final String ATM_NO = "atmbrno";
private static final String ATM_PLACE = "atmbrname";

// contacts JSONArray
//JSONArray contacts = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_item);

    String brName=getIntent().getExtras().getString("key");


    /*Bundle b = getIntent().getExtras();
    brName = b.getString("key");
    */


    // Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

    // Creating JSON Parser instance
    JSONParser jParser = new JSONParser();

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url,brName);


    try{
        //String results;
        JSONArray contacts = json.getJSONArray(TAG_CONTACTS);

        for(int i = 0; i < contacts.length(); i++){
            JSONObject json_data = contacts.getJSONObject(i);

            // Storing each json item in variable
            String atm_id = json_data.getString(ATM_NO);
            String atm_name = json_data.getString(ATM_PLACE);

            HashMap<String, String> map = new HashMap<String, String>();

            map.put(ATM_NO, atm_id);
            map.put(ATM_PLACE, atm_name);

            contactList.add(map);                
        }                       
    }

    catch(JSONException e) {
        e.printStackTrace();

    }

    /**
     * Updating parsed JSON data into ListView
     * */
   ListAdapter adapter = new SimpleAdapter(this, contactList,
            R.layout.list_main,
            new String[] { ATM_NO, ATM_PLACE }, new int[] {
                    R.id.name , R.id.email });

    setListAdapter(adapter);

}}
4

3 回答 3

1

您可以将 json 对象更改为 json 数组,

  public class JSONParser {

static InputStream is = null;
static JSONArray jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

    public JSONArray getJSONFromUrl(String url,String a) {

        ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
        postParameters.add(new BasicNameValuePair("branchname", a));

        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            httppost.setEntity(new UrlEncodedFormEntity(postParameters));

            HttpResponse httpResponse = httpClient.execute(httppost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();          

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON Array
        try {
            jObj = new JSONArray(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }


        return jObj;            
}}

您的返回数据是 json 数组,但是您转换了 json 对象,这只是引发异常。

  static JSONArray jObj = null;

   // try parse the string to a JSON Array
    try {
        jObj = new JSONArray(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }
于 2012-09-13T06:01:56.573 回答
1

根据您的要求发布

   public class JSONParser {

    static InputStream is = null;
     static JSONArray jObj = null;
    static String json = "";

     // constructor
    public JSONParser() {

  }

public JSONArray getJSONFromUrl(String url,String a) {

    ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
    postParameters.add(new BasicNameValuePair("branchname", a));

    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        httppost.setEntity(new UrlEncodedFormEntity(postParameters));

        HttpResponse httpResponse = httpClient.execute(httppost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();          

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONArray(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }


    return jObj;            
   }}

并在解析类

 public class ListAtmActivity extends ListActivity{

 private static String url ="http://10.0.2.2:8080/hello/AvailabilityResponse";

 //TextView error;
  //String brName;

   //Bundle b = getIntent().getExtras();
 //String brName = b.getString("key");

private static final String TAG_CONTACTS = "contacts";
private static final String TAG_ID = "id";
private static final String ATM_NO = "atmbrno";
 static final String ATM_PLACE = "atmbrname";

 // contacts JSONArray
  //JSONArray contacts = null;

    @Override
  public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_item);

String brName=getIntent().getExtras().getString("key");


/*Bundle b = getIntent().getExtras();
brName = b.getString("key");
*/


// Hashmap for ListView
ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

// Creating JSON Parser instance
JSONParser jParser = new JSONParser();

// getting JSON string from URL
 JSONArray contacts = jParser.getJSONFromUrl(url,brName);


try{
    //String results;


    for(int i = 0; i < contacts.length(); i++){
        JSONObject json_data = contacts.getJSONObject(i);

        // Storing each json item in variable
        String atm_id = json_data.getString(ATM_NO);
        String atm_name = json_data.getString(ATM_PLACE);

        HashMap<String, String> map = new HashMap<String, String>();

        map.put(ATM_NO, atm_id);
        map.put(ATM_PLACE, atm_name);

        contactList.add(map);                
    }                       
}

catch(JSONException e) {
    e.printStackTrace();

}

  /**
   * Updating parsed JSON data into ListView
   * */
  ListAdapter adapter = new SimpleAdapter(this, contactList,
        R.layout.list_main,
        new String[] { ATM_NO, ATM_PLACE }, new int[] {
                R.id.name , R.id.email });

   setListAdapter(adapter);

   }}
于 2012-09-13T06:50:28.173 回答
0

你需要 JsonArray 来解析得到的 String ,基本上你在响应中得到 JsonArray 。

JSONArray jObj = null;

   // try parse the string to a JSON Array
    try {
        jObj = new JSONArray(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }
于 2012-09-13T06:13:39.267 回答