【问题标题】:How to print the entire JSON output?如何打印整个 JSON 输出?
【发布时间】:2013-12-16 15:32:59
【问题描述】:

请看下面的代码

package com.example.jsontest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText editText;

/** Called when the activity is first created. */

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

    editText = (EditText)findViewById(R.id.edit_text);

    //Call The JSon
    try {
        JSONObject jObject = new JSONObject(getJson());


        int code = jObject.getInt("code");

        editText.append("Code: "+code+"\n");

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

  }

  private String getJson()
  {
      DefaultHttpClient   httpclient = new DefaultHttpClient();
      HttpPost httppost = new HttpPost("https://bigml.io/andromeda/source/5277b1bd035d074e940056e0?username=xxx;api_key=xxxxxxxxxxxxxxx");
      // Depends on your web service
      httppost.setHeader("Content-type", "application/json");

      InputStream inputStream = null;
      String result = null;
      try {
          HttpResponse response = httpclient.execute(httppost);           
          HttpEntity entity = response.getEntity();

          inputStream = entity.getContent();
          // json is UTF-8 by default
          BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
          StringBuilder sb = new StringBuilder();

          String line = null;
          while ((line = reader.readLine()) != null)
          {
              sb.append(line + "\n");
          }
          result = sb.toString();
      } catch (Exception e) { 
          // Oops
      }
      finally {
          try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
      }

      return result;
  }
} 

在这里,我需要做的是,打印我检索到的“整个”结果。我希望打印整个东西,我不需要单独的值。我怎样才能做到这一点? Here 是 BigML 检索文档的链接。

【问题讨论】:

  • 老兄,您发布了您的用户名和 api 密钥。
  • @323go: nono :) 我在免费的在线教程中找到了这些 :)
  • 哥们,你转发了别人的用户名和api密钥! ;)
  • @323go:哈哈哈..OKOK。我会删除它。 API 密钥和所有内容都可以在他的教程中免费获得。

标签: android json get bigdata


【解决方案1】:

只需使用JSONObject.toString() 吗?

【讨论】:

    【解决方案2】:

    你不应该在主线程上连接到网络。最好和最简单的选择是使用AsyncTask<...>

    类似这样的:

    private class DownloadProductsTask extends AsyncTask<Void, Void, String> {
    
        @Override
        protected String doInBackground(Void... params) {
            try {
                return new PublicDataDBManager().retriveJsonData(mCode, mUserMail);
            } catch (Exception e) {
            }
            return null;
        }
    
        @Override
        protected void onPostExecute(String result){
            buildData(result);// here you update mathod in your main thread
        }
    }
    

    这是一个简单的例子:http://androide-examples.blogspot.com/2013/11/android-retrieve-json-data-from-url.html

    【讨论】:

      【解决方案3】:

      所以我运行了你的代码,但它崩溃了。我还看到您在主线程中绕过安全性并在onCreate 中执行网络操作。这在 Android 中不是一个好主意。网络操作应该在后台线程中进行。

      我很快重构了它以使用一个线程并且它起作用了。代码如下:

        @Override
        public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      
          setContentView(R.layout.activity_main);
      
          editText = (EditText)findViewById(R.id.edit_text);
        }
      
        @Override
      protected void onResume() {
          // TODO Auto-generated method stub
          super.onResume();
      
          new Thread(new Runnable() {
      
              @Override
              public void run() {
                  JSONObject jObject;
                  try {
                      jObject = new JSONObject(getJson());
                      // I am logging the raw value that was returned here
                      Log.i("JSON Body", jObject.toString());
                      int code = jObject.getInt("code");
                  } catch (JSONException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
      
              }
          }).start();
      }
      

      如果您想更新线程内的主线程 (MainActivity),请创建一个 Handler 并将对它的引用传递到线程中,并将其用于更新。

      【讨论】:

      • 这通常是个好建议,但它并不能回答所提出的问题。此外,NetworkOnMainThreadException 在 Stackoverflow 上得到了很好的介绍——直接使用 Threads 通常被贬低为支持 AsyncTasks。
      • @323go 我确实回答了这个问题——看看'Log.i("MainActivity", jObject.toString());`这行——这显示了打印JSON的字符串值到日志。至于 Thread 与 AsyncTask,我不知道一个总是比另一个好。请参阅stackoverflow.com/questions/18480206/…,详细讨论每种方法的优点。
      • 它仍然是一个糟糕的答案,因为单行答案深埋在与所要求的任务无关的代码中。即使只是用有用的标签替换 "MainActivity" 也会改进这篇文章。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      相关资源
      最近更新 更多