2014-02-08 1 views
0

У меня возникают проблемы с разбором данных JSON в приложении для Android. Мне нужно проанализировать объект JSON, как показано ниже. Для моего приложения я хочу вытащить это json-хранилище в массив. затем отображать каждый вопрос вместе с возможными ответами с помощью текстового вида и кнопок. Затем я хочу отобразить следующий вопрос в массиве вместе с возможными ответами.Android JSON-файл parse store в списке массивов, который будет меняться каждый раз при нажатии кнопки

JSON объект

{ 
    "52f66c6eb82944cc1c00002a": { 
     "_id": { 
      "$id": "52f66c6eb82944cc1c00002a" 
     }, 
     "Question": "Capital city of England", 
     "Answer 1": "Paris", 
     "Answer 2": "Liverpool", 
     "Correct Answer": "London" 
    }, 
    "52f66c8ab82944780d000029": { 
     "_id": { 
      "$id": "52f66c8ab82944780d000029" 
     }, 
     "Question": "Capital city of Ireland", 
     "Answer 1": "Cork", 
     "Answer 2": "Liverpool", 
     "Correct Answer": "Dublin" 
    } 
} 

андроид код

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    protected TextView TitleTextView; 
    protected Button PossibleAnswer1; 
    protected Button PossibleAnswer2; 
    protected Button CorrectAnswer; 
    protected String URL ="http://127.0.0.1/mongo-form-create-quiz/processform.php"; 
    protected HttpClient HTTPClient; 
    protected HttpPost HTTPPost; 
    protected HttpResponse ResponseFromWeb; 
    protected String JSONString; 
    protected JSONObject JSONObject; 
    protected String JSONQuestion; 
    protected String JSONPossibleAnswer1; 
    protected String JSONPossibleAnswer2; 
    protected String JSONCorrectAnswer; 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppostresponse = new HttpPost("http://127.0.0.1/mongo-form-create-quiz/recordinput.php"); 
    Intent openLastActivity = new Intent("com.example.quizqizzdemo.LASTACTIVITY"); 


    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     StrictMode.ThreadPolicy policy = new StrictMode. 
     ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 

     setContentView(R.layout.activity_main); 

     HTTPClient = new DefaultHttpClient(); 
     HTTPPost = new HttpPost(URL); 

     TitleTextView = (TextView) findViewById(R.id.Question_Title); 


     PossibleAnswer1 = (Button) findViewById(R.id.PossibleAnswer1); 

     PossibleAnswer2 = (Button) findViewById(R.id.PossibleAnswer2); 

     CorrectAnswer = (Button) findViewById(R.id.CorrectAnswer); 

     try{ 
      ResponseFromWeb = HTTPClient.execute(HTTPPost); 

      JSONString = FormatJSONInput(
        ResponseFromWeb.getEntity().getContent()).toString(); 
      JSONObject = new JSONObject(JSONString); 

      JSONQuestion = JSONObject.getString("Question"); 
      JSONPossibleAnswer1 = JSONObject.getString("Answer 1"); 
      JSONPossibleAnswer2 = JSONObject.getString("Answer 2"); 
      JSONCorrectAnswer = JSONObject.getString("Correct Answer"); 

      TitleTextView.setText(JSONQuestion); 
      PossibleAnswer1.setText(JSONPossibleAnswer1); 
      PossibleAnswer2.setText(JSONPossibleAnswer2); 
      CorrectAnswer.setText(JSONCorrectAnswer); 

     } 

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



     PossibleAnswer1.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View arg0) { 

        /* 
       Toast.makeText(getApplicationContext(), 
           "Incorrect!!", Toast.LENGTH_LONG).show(); 
       PossibleAnswer1.setBackgroundColor(Color.RED); 
       */ 

        try { 
         // Add your data 
         List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
         nameValuePairs.add(new BasicNameValuePair("UserAnswer", JSONPossibleAnswer1)); 
         nameValuePairs.add(new BasicNameValuePair("CorrectAnswer", JSONCorrectAnswer)); 
         httppostresponse.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

         // Execute HTTP Post Request 
         HttpResponse response = httpclient.execute(httppostresponse); 


         startActivity(openLastActivity); 

        } catch (ClientProtocolException e) { 
         // TODO Auto-generated catch block 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
        } 

       } 
     }); 

     PossibleAnswer2.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View arg0) { 

        /* 
       Toast.makeText(getApplicationContext(), 
          "Incorrect!!", Toast.LENGTH_LONG).show(); 
       PossibleAnswer1.setBackgroundColor(Color.RED); 
       */ 

        try { 
         // Add your data 
         List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
         nameValuePairs.add(new BasicNameValuePair("UserAnswer", JSONPossibleAnswer2)); 
         nameValuePairs.add(new BasicNameValuePair("CorrectAnswer", JSONCorrectAnswer)); 
         httppostresponse.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

         // Execute HTTP Post Request 
         HttpResponse response = httpclient.execute(httppostresponse); 

         startActivity(openLastActivity); 

        } catch (ClientProtocolException e) { 
         // TODO Auto-generated catch block 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
        } 

       } 
     }); 

     CorrectAnswer.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View arg0) { 

        /* 
       Toast.makeText(getApplicationContext(), 
          "Correct!!", Toast.LENGTH_LONG).show(); 
       CorrectAnswer.setBackgroundColor(Color.GREEN); 
       */ 

       try { 
        // Add your data 
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
        nameValuePairs.add(new BasicNameValuePair("UserAnswer", JSONCorrectAnswer)); 
        nameValuePairs.add(new BasicNameValuePair("CorrectAnswer", JSONCorrectAnswer)); 
        httppostresponse.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

        // Execute HTTP Post Request 
        HttpResponse response = httpclient.execute(httppostresponse); 

        startActivity(openLastActivity); 

       } catch (ClientProtocolException e) { 
        // TODO Auto-generated catch block 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
       } 
       } 
     }); 
    } 
    private StringBuilder FormatJSONInput(InputStream is) { 
     String ReadLine = ""; 
     StringBuilder CorrectDBData = new StringBuilder(); 

     BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 

     try { 
      while ((ReadLine = rd.readLine()) != null) { 
       CorrectDBData.append(ReadLine); 
      } 
     } 

     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return CorrectDBData; 
    } 

} 

Я могу сделать это, используя массив строк, но для моего приложения мне нужно отобразить эти данные, которые включены в базу данных MongoHQ.

Я студент и новичок в Android, json и mongodb.

+0

это полный JSON, то, что вы пробовали до сих пор? –

+0

Да, json - это отображение на веб-странице php, которое будет увеличиваться по мере добавления вопросов. Я могу разобрать один вопрос и отобразить его в приложении Android, но мне нужно отобразить следующий вопрос после нажатия кнопки – peterodoherty92

+0

, если вы сможете разобрать этот json, а затем проблема в отображении данных? –

ответ

0

если вы будете вытаскивать новый вопрос с сервера каждый раз, когда вы нажимаете кнопку. Я предлагаю вам поставить этот код в новый метод, то просто вызвать метод, когда вы сделали работу в onClick() методы

, но если вы просто получите все вопросы сразу я предлагаю вам преобразовать его в JSONObject, как ты тогда делать, как

ArrayList<JSONObject> list = new ArrayList<JSONObject>(); 
JSONArray names = json.names(); 
for(int i =0; i<json.length();i++){ 
    JSONObject innerJson = json.getJSONObject(names.optString(i)); 
    /* put stuffs in object*/ 
    /* add object to list */ 
    list.add("parse object"); 
} 

после того, как вы получили список при нажатии следующей кнопки вы просто получить свой объект из списка вместо

+0

Хорошо, но я не уверен, что мне нужно будет тянуть с сервера каждый раз, когда нажимается кнопка? как только объект json создается, он однажды меняет время использования – peterodoherty92

+0

. Я отредактировал свой ответ, пожалуйста, проверьте его снова. – zilchrhythm

+0

Спасибо, я немного смущен. Извините. Что такое json.names()? как мне это получить? это внутренние вопросы? и я добавлю их в объект для каждого цикла, а затем в список? – peterodoherty92

Смежные вопросы