2013-08-10 7 views
1

Мне нужна небольшая помощь здесь, как с небольшим советом. Мне нужен дополнительный набор глаз, чтобы посмотреть мой код и посмотреть, есть ли ошибка с данными Yahoo Answers JSON, которые я проанализировал. Я думаю, что я правильно проанализировал данные JSON, и я просто хочу, чтобы кто-то просмотрел его, чтобы убедиться, что у меня есть правильные данные.Android json parse

Это данные, которые я пытаюсь разобрать из моего веб-сервиса:

{ 
"query": { 
    "count": 1, 
    "created": "2013-08-09T19:37:46Z", 
    "lang": "en-US", 
    "diagnostics": { 
    "publiclyCallable": "true", 
    "url": { 
    "execution-start-time": "524", 
    "execution-stop-time": "783", 
    "execution-time": "259", 
    "proxy": "DEFAULT", 
    "content": "http://answers.yahooapis.com/AnswersService/V1/getQuestion?question_id=20100207231859AAZVura" 
    }, 
    "user-time": "783", 
    "service-time": "259", 
    "build-version": "38788" 
    }, 
    "results": { 
    "Question": { 
    "id": "20100207231859AAZVura", 
    "type": "Answered", 
    "Subject": "What gives some humans the idea that you cannot prove a negative?", 
    "Content": "Seriously, humans, what is this nonsense? For one thing, the statement 'You cannot prove a negative' is itself phrased negatively. So if it's true, how could you possibly know?\n\nBut more to the point, a negative claim can be disproved in precisely the same ways as a positive claim. Let's take something clearly false as an example, yes? So, square circles. If I say that there is a shape that is both a square and a circle, you can disprove my claim (that is, you can prove the negative claim that there is no such shape) by demonstrating that the property of being square contradicts the property of being circular. Simple, yes?\n\nSo what's the deal? Please explain using words that a clock can understand.\nAonghas, that is true only if the metaphysical things in question have no connection to the physical world. A god who is said to have done things on Earth can be disproved by establishing that those things did not happen, for example.\n\nHuliendin, just because the truth value of a statement may change does not mean that it does not have one at any given point in time.\n\nDavid, a square is defined as a shape with particular characteristics. If a shape does not have those characteristics, it is not a square. It is not possible to discover a square that does not fit the definition of a square. The same goes for a circle. And since the two definitions contradict each other, a shape cannot fit both.\n\nRyan, many humans certainly do have ideas about the properties a god would have. They've written books attributing certain propreties to gods.\nWilliam, you misunderstand the nature of my example. It doesn't matter whether I have seen one. The fact is that if one did exist, it would have to fit the definition of a square and it would have to fit the definition of a circle. That means that, for example, it would have to have exactly one side and exactly four sides. That is a contradiction, and it is a fundamental assumption of logic that a contradictory statement must be false.\nBloodzwurth, you have trouble proving that because you're being deliberately vague. It has nothing to do with negativity. You would have exactly the same difficulty trying to prove that claim to be true as you would trying to prove it to be false.\nI didn't know you spoke clock, CAt. Anyway I agree with you, but only in respect to a posteriori arguments.\nHuliendin, you are treating my proof as an inductive argument, which it is not. I am not saying that no squares are also circles because we haven't come across any yet.\n\nLet's put it this way.\n1. If x is a square, then x has straight sides. (That is part of the definition of a square, and so this statement is tautologous and hence must be correct.)\n2. If x is a circle, then x does not have straight sides. (Again, just part of the definition.)\n3. x is both a circle and a square. (Assumed premise.)\n4. x has straight sides (from 1 and 3).\n5. x does not have straight sides (from 2 and 3).\n6. x does and does not have straight sides (from 4 and 5).\n7. x is not both a square and a circle (from 3 and 6, reductio ad absurdum).\n\nSee? Simple deductive logic. This proof works for any shape 'x' regardless of whether it has been found or not. What I have demonstrated is not just that a square circle does not exist, but that a square circle cannot exist.\n", 
    "Date": "2010-02-07 23:18:59", 
    "Timestamp": "1265584739", 
    "Link": "http://answers.yahoo.com/question/?qid=20100207231859AAZVura", 
    "Category": { 
    "id": "396545163", 
    "content": "Religion & Spirituality" 
    }, 
    "UserId": "v2w0u1XAaa", 
    "UserNick": "Yellow Alarm Clock", 
    "UserPhotoURL": "http://socialprofiles.zenfs.com/images/a3b93240efb619ea3d1b5e2e90844784_48.jpg", 
    "NumAnswers": "9", 
    "NumComments": "2", 
    "ChosenAnswer": "Words a clock can understand huh? Hmmm\n \nOk\n\nTic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic toc tic t", 
    "ChosenAnswererId": "FWZentXQaa", 
    "ChosenAnswererNick": "The CAt in the Tin Foil HAt v21", 
    "ChosenAnswerTimestamp": "1265585654", 
    "ChosenAnswerAwardTimestamp": "1265757240", 
    "Answers": { 
    "Answer": [ 
     { 
     "Content": "It doesn't matter if you're talking about metaphysical matters (the existence of gods, the afterlife, spirits, whatever), because there's no evidence for or against metaphysical things. Unless you count the lack of evidence as evidence of absence (and some people do, and some people don't).\n\nThe whole point of the matter is that people should just stop worrying about religious/spiritual stuff and just get on with their lives.", 
     "Reference": null, 
     "Best": null, 
     "UserId": "DrMxELRraa", 
     "UserNick": "Aonghas M", 
     "Date": "2010-02-07 23:22:28", 
     "Timestamp": "1265584948" 
     }, 

MainActivty:

public class MainActivity extends Activity { 

    Button getanswer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button getanswer = (Button) findViewById(R.id.button1); 
     getanswer.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) {  
      EditText et = (EditText) findViewById(R.id.editText1); 
      String searchTerm = et.getText().toString().trim();   
      Intent in = new Intent(MainActivity.this, ListView.class); 
      in.putExtra("TAG_SEARCH", searchTerm); 
      startActivity(in); 
     } 

     }); 
    }} 

Это способ, которым я пытался разобраны данные из веб-службы:

public class ListView extends ListActivity {  


    ArrayList<HashMap<String, String>> questionList;   

    final String TAG_RESULTS = "results"; 
    final String TAG_QUESTION_SUBJECT = "Subject"; 
    final String TAG_QUESTION_NUMANSWERS = "NumAnswers"; 
    final String TAG_QUESTION = "question"; 
    final String TAG_QUESTION_CONTENT = "Content"; 
    final String TAG_QUESTION_CHOSENANSWER = "ChosenAnswer"; 
    final String TAG_ANSWERS = "answers"; 
    final String TAG_ANSWER = "answer";  
    final String TAG_ANSWERS_CONTENT = "content";  
    final String TAG_QUERY = "query"; 

      JSONArray question = null;   

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




     new LoadAllData().execute(); 
     } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (resultCode == 100) { 
      Intent intent = getIntent(); 
      startActivity(intent); 
      finish(); 
     } 
    } 

    class LoadAllData extends AsyncTask<String, String, String> { 


     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      ProgressDialog pDialog; 
      pDialog = new ProgressDialog(ListView.this); 
      pDialog.setMessage("Loading Data. Please wait..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
      if (pDialog != null && pDialog.isShowing()) pDialog.dismiss(); 

     } 

     protected String doInBackground(String... args) { 

      try { 
       Intent in = getIntent(); 
       String searchTerm = in.getStringExtra("TAG_SEARCH"); 
       String query = URLEncoder.encode(searchTerm, "utf-8"); 
       String URL = "http://example.com"; 
       JSONParsser jParser = new JSONParsser(); 
       JSONObject json = jParser.readJSONFeed(URL); 
       try { 
        //question = json.getJSONArray(TAG_QUESTION); 


        JSONArray questions = json.getJSONObject("all").getJSONArray("questions"); 

        for(int i = 0; i < questions.length(); i++) { 
         JSONObject question = questions.getJSONObject(i); 


        String Subject = question.getString(TAG_QUESTION_SUBJECT); 
        String NumAnswers = question.getString(TAG_QUESTION_NUMANSWERS); 
        String ChosenAnswer = question.getString(TAG_QUESTION_CHOSENANSWER); 
        String Content = question.getString(TAG_QUESTION_CONTENT); 

        JSONArray answers = question.getJSONObject(TAG_ANSWERS).getJSONArray(TAG_ANSWER); 


        JSONObject answer = answers.getJSONObject(0); 

        String content = answer.getString(TAG_ANSWERS_CONTENT); 

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

           map.put(TAG_QUESTION_SUBJECT, Subject); 
           map.put(TAG_QUESTION_NUMANSWERS, NumAnswers); 

           questionList.add(map); 


        } 


       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } catch (UnsupportedEncodingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

       return TAG_QUESTION  ; 



     } 
     protected void onPostExecute(String file_URL) { 

       ListAdapter adapter = new SimpleAdapter(getBaseContext(), questionList, 
         R.layout.listview, 
         new String[] { TAG_QUESTION_SUBJECT, TAG_QUESTION_NUMANSWERS }, new int[] { 
         R.id.Subject, R.id.NumAnswers }); 

       setListAdapter(adapter); 

       android.widget.ListView lv = getListView(); 

       lv.setOnItemClickListener(new OnItemClickListener() { 

        @Override 
        public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) { 
         // TODO Auto-generated method stub 

        } 

       });  

     }} 

    } 

сообщение об ошибке:

08-11 02:42:52.882: E/AndroidRuntime(4516): FATAL EXCEPTION: AsyncTask #1 
08-11 02:42:52.882: E/AndroidRuntime(4516): java.lang.RuntimeException: An error occured while executing doInBackground() 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at android.os.AsyncTask$3.done(AsyncTask.java:299) 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at java.lang.Thread.run(Thread.java:856) 
08-11 02:42:52.882: E/AndroidRuntime(4516): Caused by: java.lang.NullPointerException 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at com.theproblemsolver.ListView$LoadAllData.doInBackground(ListView.java:118) 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at com.theproblemsolver.ListView$LoadAllData.doInBackground(ListView.java:1) 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
08-11 02:42:52.882: E/AndroidRuntime(4516):  at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
08-11 02:42:52.882: E/AndroidRuntime(4516):  ... 4 more 

Когда я читаю logcat, я получаю системную ошибку, которая говорит, что моя строка результатов не имеет значения. Веб-служба возвращает данные в мою строку jObj, но не в мирные данные, которые я проанализировал.

ответ

3

Редактировать 3: Похоже на ответ JSON, который вы ожидаете, и фактический ответ имеет разные структуры. Попробуйте это:

JSONArray questions = jObj.getJSONObject("all").getJSONArray("questions"); 

for(int i = 0; i < questions.length(); i++) { 
    JSONObject question = questions.getJSONObject(i); 

    String subject = question.getString("Subject"); 
    String numAnswers = question.getString("NumAnswers"); 
    String chosenAnswer = question.getString("ChosenAnswer"); 
    String content = question.getString("Content"); 
} 

Edit 2: С полной JSON вы в курсе, вы можете увидеть иерархию:

query -> results -> Question 

Это Question узел содержит всю необходимую информацию. Это, как вы получите ссылку на него:

final String TAG_QUERY = "query"; 

JSONObject question = jObj.getJSONObject(TAG_QUERY) 
    .getJSONObject(TAG_RESULTS) 
    .getJSONObject(TAG_QUESTION); 

От того, вы можете получить данные, которые вы хотите, как не следует (нет необходимости в цикле, так как есть только один вопрос):

String subject = question.getString(TAG_QUESTION_SUBJECT); 
String numAnswers = question.getString(TAG_QUESTION_NUMANSWERS); 
String chosenAnswer = question.getString(TAG_QUESTION_CHOSENANSWER); 
String content = question.getString(TAG_QUESTION_CONTENT); 

JSONArray answers = question.getJSONObject(TAG_ANSWERS).getJSONArray(TAG_ANSWER); 

// If you only want the first answer: 
JSONObject answer = answers.getJSONObject(0); 

String content = answer.getString(TAG_ANSWERS_CONTENT); 

Попробуйте и дайте мне знать, как это происходит!


Edit: могли бы скопировать и вставить весь ответ JSON? Невозможно помочь вам, если мы не сможем увидеть структуру JSON.


В JSON вернулся из API Yahoo финансов, results узел не является массивом, это объект, который содержит массив: Question, который является тот, который вы ищете. Попробуйте следующий код:

final String TAG_RESULTS = "results"; 
final String TAG_QUESTION_SUBJECT = "Subject"; 
final String TAG_QUESTION_NUMANSWERS = "NumAnswers"; 
final String TAG_QUESTION = "Question"; 
final String TAG_QUESTION_CONTENT = "Content"; 
final String TAG_QUESTION_CHOSENANSWER = "ChosenAnswer"; 
final String TAG_ANSWERS = "Answers"; 
final String TAG_ANSWER = "Answer";  
final String TAG_ANSWERS_CONTENT = "Content";  

JSONArray questions = jObj.getJSONObject(TAG_RESULTS).getJSONArray(TAG_QUESTION); 

for(int i = 0; i < questions.length(); i++) { 
    JSONObject question = questions.getJSONObject(i); 

    String subject = question.getString(TAG_QUESTION_SUBJECT); 
    String numAnswers = question.getString(TAG_QUESTION_NUMANSWERS); 
    String chosenAnswers= question.getString(TAG_QUESTION_CHOSENANSWER); 
    String content = question.getString(TAG_QUESTION_CONTENT); 

    JSONObject answers = question.getJSONObject(TAG_ANSWERS); 
    JSONObject answer = answers.getJSONObject(TAG_ANSWER); 
    String Content = answers.getString(TAG_ANSWERS_CONTENT); 
} 
+0

я отправил полные данные в формате JSON –

+0

Попробуйте то, что я сказал в обновленном ответ , –

+0

Хорошим новым является то, что моего приложения больше нет, и просто говорит, что у него есть системная ошибка, которая говорит, что запрос не имеет значения. ой, а также у меня есть приложение, чтобы вернуть 25 в моем запросе url, но я поставил его, чтобы попробовать 1 вопрос, но все тот же результат. –

1

Я рекомендую взглянуть на библиотеку gson для преобразования из объектов ява в JSON и наоборот. http://code.google.com/p/google-gson/

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

0

Возможно, вам следует создать класс для всех объектов, которые вам нужно создать, что упростит вам ... и вы должны попробовать пост @Raman, но вы можете захотеть получить массив из всех ответов, а не объект так же, как @Raman сказал так что вместо

JSONObject answers = question.getJSONObject(TAG_ANSWERS); 

вы можете захотеть сделать это массив, как это к петле через него

JSONArray answers = question.getJSONArray(TAG_ANSWERS); 
1

Как уже было рекомендовано в одном из комментариев, которые могли бы сделать это гораздо более легко с библиотекой GSON, вы можете проверить это руководство я написал на его использование, а разница между использованием этой библиотеки и используя собственный объект, как вы в настоящее время сделать прямо сейчас:

Parsing JSON Files with Gson and Native Objects