2014-02-08 2 views
0

내 안드로이드 응용 프로그램에 JSON 데이터를 구문 분석하는 데 문제가 있습니다. 아래 나열된 JSON 객체를 구문 분석해야합니다. 내 응용 프로그램의 경우이 json 데이터를 배열에 저장하려고합니다. 텍스트보기 및 버튼을 사용하여 각 질문을 가능한 답변과 함께 표시하십시오. 그런 다음 배열에 다음 질문을 가능한 답과 함께 표시하려고합니다.안드로이드 JSON 개체를 구문 분석 저장할 때마다 변경 될 배열 목록에 저장

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" 
    } 
} 

내가 문자열 배열을 사용하지만 내 응용 프로그램에 대해 나는 mongohq 데이터베이스에서 인이 데이터를 표시하기 위해 필요한이 작업을 수행 할 수 있습니다

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; 
    } 

} 

안드로이드 코드입니다.

저는 학생이며 Android, json 및 mongodb를 처음 사용합니다.

+0

이 전체 JSON이다에서 개체를 얻을 수 있습니다 다음 버튼을 누를 때 목록을 가지고 후에? –

+0

예 json은 질문이 추가되면서 증가 할 PHP 웹 페이지에 표시됩니다. 저는 하나의 질문을 구문 분석하여 Android 응용 프로그램에 표시 할 수 있지만 버튼을 클릭 한 후 다음 질문을 표시해야합니다.이 json을 구문 분석 할 수 있다면 – peterodoherty92

+0

데이터를 표시하는 데 문제가 있습니까? –

답변

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