1

ちょっとしたアドバイスと同じように、ここで少し助けが必要です。コードを見て、解析した Yahoo Answers JSON データにエラーがないかどうかを確認するために、追加の目が必要です。私は JSON データを間違って解析したと思います。正しいデータが解析されていることを確認するために、誰かにそれを調べてもらいたいだけです。

これは、Web サービスから解析しようとしているデータです。

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

メインアクティビティ:

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

        });
    }}

これは、Web サービスからのデータを解析しようとした方法です。

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 を読むと、結果の文字列に値がないというシステム エラーが表示されます。Web サービスはデータを jObj 文字列に返しますが、解析した太平洋データは返しません。

4

4 に答える 4

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

編集 2:投稿した完全な JSON を使用すると、階層を確認できます。

query -> results -> Question

そのQuestionノードには、必要なすべての情報が含まれています。これは、それへの参照を取得する方法です。

final String TAG_QUERY = "query";

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

そこから、次のように必要なデータを取得できます (質問は 1 つしかないため、ループは必要ありません)。

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

それを試してみて、それがどうなるか教えてください!


編集: JSON 応答全体をコピーして貼り付けていただけますか? JSON の構造が見えない場合、あなたを助けることは不可能です。


Yahoo Finance API から返された JSON では、ノードは配列ではなく、探している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);
}
于 2013-08-10T17:14:49.473 に答える
1

Java オブジェクトから json への変換、およびその逆の変換については、gson ライブラリを参照することをお勧めします。http://code.google.com/p/google-gson/

シリアル化された name 属性で装飾されたすべての関連フィールドを持つクラスを作成し、オブジェクトを手動で構築することなく、1 行のコードで json との間で変換できます。

于 2013-08-10T17:29:07.913 に答える
1

コメントの 1 つで既に推奨されているように、ライブラリを使用するとこれをはるかに簡単に行うことができます。GSON使用方法と、現在行っているようにこのライブラリを使用する場合とネイティブ オブジェクトを使用する場合の違いについて書いたこのガイドを確認できます。

Gson およびネイティブ オブジェクトを使用した JSON ファイルの解析

于 2013-08-11T00:30:41.823 に答える
0

おそらく、作成する必要があるすべてのオブジェクトのクラスを作成する必要があります。これにより、簡単になります...そして、@ Ramanの投稿を試す必要がありますが、オブジェクトではなく、すべての回答の配列を取得したい場合があります@Ramanは代わりにそう言った

JSONObject answers = question.getJSONObject(TAG_ANSWERS);

ループするために、このような配列にしたいかもしれません

JSONArray answers = question.getJSONArray(TAG_ANSWERS);
于 2013-08-10T18:32:13.533 に答える