2013-07-10 83 views
1

如何检索用于android的JSON Web服务数据?我目前正在尝试以JSON格式检索事件数据并显示它,但我不确定该怎么做。但不知何故,我无法在我的移动应用程序中运行。下面是我的代码的示例:Json Web服务数据检索

package com.androidhive.jsonparsing; 

import java.util.ArrayList; 
import java.util.HashMap; 

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

import android.app.ListActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 

public class AndroidJSONParsingActivity extends ListActivity { 

    // url to make request 
    private static String url = "http://api.eventful.com/json/events/get?app_key=rDkKF6nSx6LjWTDR&id=E0-001-000324672-7"; 

    // JSON Node names 
    private static final String TAG_ID = "id"; 
    private static final String TAG_REGION = "region"; 
    private static final String TAG_STARTTIME = "start_time"; 
    private static final String TAG_TITLE = "title"; 
    private static final String TAG_CITY = "city"; 
    private static final String TAG_VENUE_NAME = "venue_name"; 

    // contacts JSONArray 
    JSONArray id; 

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

     // 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); 

     try { 
      // Getting Array of Contacts 
      id = json.getJSONArray(TAG_ID); 

      // looping through All Contacts 
      for (int i = 0; i < id.length(); i++) { 
       JSONObject c = id.getJSONObject(i); 

       // Storing each json item in variable 
       String mid = c.getString(TAG_ID); 
       String region = c.getString(TAG_REGION); 
       String starttime = c.getString(TAG_STARTTIME); 
       String mtitle = c.getString(TAG_TITLE); 
       String city = c.getString(TAG_CITY); 
       String venuename = c.getString(TAG_VENUE_NAME); 

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

       // adding each child node to HashMap key => value 
       map.put(TAG_ID, mid); 
       map.put(TAG_REGION, region); 
       map.put(TAG_STARTTIME, starttime); 
       map.put(TAG_TITLE, mtitle); 
       map.put(TAG_CITY, city); 
       map.put(TAG_VENUE_NAME, venuename); 

       // adding HashList to ArrayList 
       contactList.add(map); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     /** 
     * Updating parsed JSON data into ListView 
     * */ 
     ListAdapter adapter = new SimpleAdapter(this, contactList, 
       R.layout.list_item, new String[] { TAG_TITLE }, 
       new int[] { R.id.mtitle }); 

     setListAdapter(adapter); 

     // selecting single ListView item 
     ListView lv = getListView(); 

     // Launching new screen on Selecting Single ListItem 
     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // getting values from selected ListItem 
       String name = ((TextView) view.findViewById(R.id.mtitle)) 
         .getText().toString(); 

       // Starting new intent 
       Intent in = new Intent(getApplicationContext(), 
         SingleMenuItemActivity.class); 
       in.putExtra(TAG_TITLE, name); 


      } 
     }); 

    } 

} 

的要求,这是JSONParser我的示例代码:

package com.androidhive.jsonparsing; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.util.Log; 

public class JSONParser { 

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

    // constructor 
    public JSONParser() { 

    } 

    public JSONObject getJSONFromUrl(String url) { 

     // Making HTTP request 
     try { 
      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 

      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 JSON String 
     return jObj; 

    } 
} 
+2

当您运行意外的代码时会发生什么?例外?电脑关机了?一位新教皇当选? :) –

+0

发布你的堆栈跟踪.. @JoachimIsaksson:lol –

+0

当我运行的代码,没有出来。只是黑屏! – Leo

回答

0

所以,如果字符串strJson是从具有HTTP请求中接收的结果字符串在例如一个ListView要填充则: -

JSONObject strJsonObj = new JSONObject(strJson); 
Listview listContent = getListFromJson(strJsonObj); 

和从strJsonObj创建JSON数组等:

JSONArray resultantArray = strJsonObj.getJSONArray("resultantTag"); 

制作一个循环遍历JsonArray每一个横移创建JSON对象:

for(int i=0; i<searchResultArray.length(); i++){ 
     JSONObject objAtI = (JSONObject) resultantArray.get(i); 
     objAtI.get("xyz").toString(); 
     objAtI.get("abc").toString(); 
} 

完蛋了。

+0

如果你觉得这个问题是重复的,而另一个问题已经有了答案,请将它标记为这样。复制和粘贴你的答案并不是那么有效。 –

0

更换

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

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

String response = getRequest(url); 
JSONObject object = new JSONObject(response); 

添加这两种功能

public String getRequest(final String url) { 
     String responseString=null; 
     try { 

      Logger.show(Log.INFO, TAG, 
        "URL " +url); 
      HttpParams httpParameters = new BasicHttpParams(); 
      HttpConnectionParams.setConnectionTimeout(httpParameters, 
        15000); 
      HttpConnectionParams.setSoTimeout(httpParameters,15000); 
      HttpClient client = new DefaultHttpClient(httpParameters); 
      HttpGet request = new HttpGet(); 
      request.setURI(new URI(url)); 
      HttpResponse response = client.execute(request); 
      InputStream ips = response.getEntity().getContent(); 
      responseString = response.toString(); 
      responseString = intputStreamToStringConvertor(ips); 

     } catch (NullPointerException e) { 
      Logger.show(e); 
      responseString = null; 
     } catch (UnsupportedEncodingException e) { 
      Logger.show(e); 
      responseString = null; 
     } catch (ClientProtocolException e) { 
      Logger.show(e); 
     } catch (IOException e) { 
      Logger.show(e); 
      responseString = null; 
     } catch (URISyntaxException e) { 
      e.printStackTrace(); 
     } 
     return responseString; 
    } 

    /** Converting InputStream to string */ 
    private static String intputStreamToStringConvertor(InputStream inputStream) { 
     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        inputStream, "UTF-8"), 800); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      inputStream.close(); 
      return sb.toString(); 
     } catch (NullPointerException e) { 
      Logger.show(e); 
      return null; 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
+0

我的窗口小部件没有显示我从JSON解析中收到的数据:/ http://stackoverflow.com/questions/20082315/using-json-to-match-a-string-with-todays-date – Si8

0

检查你JSONParser类:

你可能会做一个POST请求,该网址BU t将其不ALLOWED.You应该改变HTTP请求,键入GET

,如果你在你的代码

HttpPost httpPost =新HttpPost(URL)找到; //然后改变它HTTPGET

ForExample:

DefaultHttpClient defaultHttpClient = new DefaultHttpClient(); 
HttpGet method = new HttpGet(new URI("youurl")); 
HttpResponse response = defaultHttpClient.execute(method); 
InputStream data = response.getEntity().getContent(); 

我发现您的决策失误。也许你刚刚学会了创建Web服务形式的博客,并根据你的要求从字面上进行了改变。这里没有错误你的缺失是json的输入格式。你提到的教程有不同的输入格式,你的URL有不同的格式。所以ü需要相应地分析你的JSONObject ..

ID = json.getJSONArray(TAG_ID);没有名称为ID的数组对象..检查你的JSON输入..我希望你能理解这个问题。

UPDATE:

没有哥们ID不是对象的在链接的阵列(标签)。所以你检索它的方式是错误的。我建议你学习json格式并解析它,这很简单。

对于实例

String data="{'foo':'bar','coolness':2.0, 'altitude':39000, 'pilot':{'firstName':'Buzz','lastName':'Aldrin'}, 'mission':'apollo 11'}"; 

我取回这样

JSONObject json = (JSONObject) JSONSerializer.toJSON(data);   
    double coolness = json.getDouble("coolness"); 
    int altitude = json.getInt("altitude"); 
    JSONObject pilot = json.getJSONObject("pilot"); 
    String firstName = pilot.getString("firstName"); 
    String lastName = pilot.getString("lastName"); 

    System.out.println("Coolness: " + coolness); 
    System.out.println("Altitude: " + altitude); 
    System.out.println("Pilot: " + lastName); 

所以代码,当你从方法接收的JSONObject不将其转换为jsonarray。只需使用

String ID = json.getString("id"); 
+0

Yeap,我用来自博客的web服务代码,并根据我的api将其更改为我的。让我张贴原始代码! 至于id = json.getJSONArray(TAG_ID),我不确定哪个部分仍然出错。从提供的链接“http://api.eventful.com/json/events/get?app_key=rDkKF6nSx6LjWTDR&id=E0-001-000324672-7”,有一个名为“id”的json输入:“E0-001- 000324672-7" 。这不是名称为ID的数组对象吗?对不起,感谢您的帮助Shanku,感激不尽:) – Leo