2012-04-03 17 views
0

多个结果,任何人都可以提出一个方法)来修改JSONParser的getQuestionJSONFromUrl(方法,这样它存储每一个问题作为自己的Android对象?通过从SQL表看起来像这样在浏览器PHP JSON返回读取多个结果:存储从JSON

{"category":"elections","id":"0","title":"Who will you vote for in November's Presidential election?","published":"2012-04-02","enddate":"2012-04-30","responsetype":"0"} 

{"category":"elections","id":"2","title":"Question title, ladies and gents","published":"2012-04-02","enddate":"2012-04-30","responsetype":"1"} 

目前,这样做的结果还不包括年底支柱之间的空间,并开始梅开二度。但我可以添加到我的PHP:回声“\ n”;当JSON读出时,这会给我两行之间的空间。所以现在显然是两排填充物。最终会在该SQL表中存在真实的内容。

我希望能够将这些行分解成对象(可能是我本地的SQLite数据库我想?),以便我可以使用它们在屏幕上显示每个片段作为片段。我并不太担心屏幕方面的问题,但将数据转换为可行的形式是一个问题。目前,我的代码只将第一组大括号存储为JSON对象。这里的所有相关代码:

public UserFunctions(){ 
    jsonParser = new JSONParser(); 
} 

public JSONObject getQuestions(String category) { 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("tag", question_tag)); 
    params.add(new BasicNameValuePair("category", category)); 
    JSONObject json = jsonParser.getQuestionJSONFromUrl(questionURL, params); 
    return json; 
} 


public class JSONParser { 

    static InputStream is = null; 
    static JSONObject jObj = null; 
    static JSONObject[] jsonArray = null; 
    static String json = ""; 

    // constructor 
    public JSONParser() { 

    } 

    public JSONObject getQuestionJSONFromUrl(String url, List<NameValuePair> params) { 

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

      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) { 
       Log.v("while", line); 
       sb.append(line + "\n"); 
       //Log.v("err", line); 
      } 
      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; 

    } 

任何人都可以提出一个方法)来修改JSONParser的getQuestionJSONFromUrl(方法,这样它存储每一个问题作为自己的Android对象?我有一个本地SQLite数据库中,我可以添加一个或两个的方法来添加第二个表等:

package library; 

import java.util.HashMap; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DatabaseHandler extends SQLiteOpenHelper { 

    // All Static variables 
    // Database Version 
    private static final int DATABASE_VERSION = 1; 

    // Database Name 
    private static final String DATABASE_NAME = "android_api"; 

    // Login table name 
    private static final String TABLE_LOGIN = "login"; 

    // Login Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_NAME = "name"; 
    public static final String KEY_EMAIL = "email"; 
    private static final String KEY_UID = "uid"; 
    private static final String KEY_CREATED_AT = "created_at"; 

    public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," 
       + KEY_NAME + " TEXT," 
       + KEY_EMAIL + " TEXT UNIQUE," 
       + KEY_UID + " TEXT," 
       + KEY_CREATED_AT + " TEXT" + ")"; 
     db.execSQL(CREATE_LOGIN_TABLE); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN); 

     // Create tables again 
     onCreate(db); 
    } 

    /** 
    * Storing user details in database 
    * */ 
    public void addUser(String name, String email, String uid, String created_at) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, name); // Name 
     values.put(KEY_EMAIL, email); // Email 
     values.put(KEY_UID, uid); // Email 
     values.put(KEY_CREATED_AT, created_at); // Created At 

     // Inserting Row 
     db.insert(TABLE_LOGIN, null, values); 
     db.close(); // Closing database connection 
    } 

    /** 
    * Getting user data from database 
    * */ 
    public HashMap<String, String> getUserDetails(){ 
     HashMap<String,String> user = new HashMap<String,String>(); 
     String selectQuery = "SELECT * FROM " + TABLE_LOGIN; 

     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     // Move to first row 
     cursor.moveToFirst(); 
     if(cursor.getCount() > 0){ 
      user.put("name", cursor.getString(1)); 
      user.put("email", cursor.getString(2)); 
      user.put("uid", cursor.getString(3)); 
      user.put("created_at", cursor.getString(4)); 
     } 
     cursor.close(); 
     db.close(); 
     // return user 
     return user; 
    } 

    /** 
    * Getting user login status 
    * return true if rows are there in table 
    * */ 
    public int getRowCount() { 
     String countQuery = "SELECT * FROM " + TABLE_LOGIN; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(countQuery, null); 
     int rowCount = cursor.getCount(); 
     db.close(); 
     cursor.close(); 

     // return row count 
     return rowCount; 
    } 

    /** 
    * Re crate database 
    * Delete all tables and create them again 
    * */ 
    public void resetTables(){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     // Delete All Rows 
     db.delete(TABLE_LOGIN, null, null); 
     db.close(); 
    } 

} 

回答

1

使getQuestionJSONFromUrl返回的字符串。然后使用该字符串创建JSONObject并解析它。看看下面的例子。

 JSONObject jsonobj=new JSONObject(str); 
     String category=jsonobj.getString("category"); 
     String title=jsonobj.getString("title"); 
     int id=jsonobj.getInt("id"); 
     String published=jsonobj.getString("published"); 
     String enddate=jsonobj.getString("enddate"); 
     int responsetype=jsonobj.getInt("responsetype"); 
     System.out.println(category+" "+title +" "+id +" "+published +" "+enddate +" "+responsetype); 
+0

这是非常有用的,并且可以像广告一样工作 - 但是如果方法getQuestion ...只运行一次,并且有20个(任意数字,有时会更多,有时它会更少)得到返回的问题,请问该方法需要改变,以适应从SQL 20个分开行? – Davek804 2012-04-03 04:04:57

+0

使用for循环,用于检索一个以上的时间,如对于 (INT I = 0; I wolverine 2012-04-03 04:16:50

+0

我花了一整天在这方面的工作,我仍然不能得到它的工作。我已经能够做的最好的是检测“} {”(二JSON结束/开始),并放置在一个字符串的第一部分,并删除了下半场。我发现我需要的方法不在那里。 – Davek804 2012-04-04 03:58:43

1

如果您回应的内容更多的结果,那么使用循环来获取所有数据,只需按照下面的代码,希望它会为你的作品。

JSONArray Arraylist = new JSONArray(); 
Arraylist=new JSONObject(output).getJSONObject("category").getJSONArray("title"); 

for (int i = 0; i < Arraylist.length(); i++) 
{ 
    JSONObject headObject = Arraylist.getJSONObject(i); 
    String Question_title= headObject.optString("Question title"); 
    String published=headObject.optString("published"); 
    String enddate=headObject.optString("enddate"); 

} 
+0

我可以看到所有这些代码如何工作,但我遇到了问题。我如何解决:while((line = reader.readLine())!= null){?这是服务器JSON输出中显示的两组{} {}之间的自然断点(空间)。我如何编写一个方法来存储被成为当前字符串,然后重做while循环当空停止其到达输出的第二行之前? – Davek804 2012-04-03 06:30:18