0

我从这里得到了非常简单的 JSON 格式数据,它看起来像这样:

{
    "date" : "2013-11-01",
    "gold" : "1317.29",
    "silver" : "21.90",
    "platinum" : "1458.00"
}

我只需要获取“gold”标签的值。

我的代码是:

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

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class JsonActivity extends Activity {

static String jsonUrl = "http://services.packetizer.com/spotprices/?f=json";
static String gold = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_json);
    new MyAsyncTask().execute();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.json, menu);
    return true;
}
private class MyAsyncTask extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... arg0) {
        DefaultHttpClient httpCl = new DefaultHttpClient(new    

   BasicHttpParams());
        HttpPost httpP = new HttpPost(jsonUrl);
        httpP.setHeader("Content-type", "application/json");
        InputStream in = null;
        String result = null;
        try {
            HttpResponse response = httpCl.execute(httpP);
            HttpEntity entity = response.getEntity();
            in = entity.getContent();
            BufferedReader reader = new BufferedReader(new 
                                            InputStreamReader(in, "UTF-8"), 8);
            StringBuilder sbuilder = new StringBuilder();

            String line = null;

            while ((line = reader.readLine()) != null) {
                sbuilder.append(line + "\n");
            }
            result = sbuilder.toString();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {
                if(in != null)
                    in.close();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        JSONObject jsonObj;
        try {
            jsonObj = new JSONObject(result);
            gold = jsonObj.getString("gold");
        }
        catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        TextView goldTV = (TextView)findViewById(R.id.goldPrice);
        goldTV.setText("good price with Json" + gold);
        super.onPostExecute(result);
    }



}
}

但是,当我运行它时,它String gold总是返回null。我想不通为什么?谁能告诉我出了什么问题?谢谢

更新 添加了一个屏幕截图: 在此处输入图像描述

4

3 回答 3

1

检查你的 jsonObj 是否为空,如果它为空,也许你应该使用这样的东西:

JSONArray jsonArray;
JSONObject parent;
    try {
        jsonArray = new JSONArray(result);
        parent = jsonArray.getJsonObject("ParentObject");
        gold = parent.getString("gold");
    }
    catch (JSONException e) {
        e.printStackTrace();
    }
于 2013-11-03T08:23:04.273 回答
1

你正在做jsonObj.getString("gold");..现在你正试图从这个 json 对象中获取一个字符串,但是在你的 json 中,没有主要的父对象,例如:-

{ 
  "Android" :
            [
                {
                   "date" : "2013-11-01",
                   "gold" : "1317.29",
                   "silver" : "21.90",
                   "platinum" : "1458.00"
                }
            ] 
}

这里 Android 是您的 jsonobject,当您调用 getstring 方法时,您将在字符串变量中获取 gold 的值。通过这两个教程,您将了解:-

来自本地的 Json 教程

来自 URL 的 Json 教程

于 2013-11-03T07:35:09.170 回答
1

只需将此代码替换为您的代码

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

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class JsonActivity extends Activity {

static String jsonUrl = "http://services.packetizer.com/spotprices/?f=json";
static String gold = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_json);
    new MyAsyncTask().execute();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.json, menu);
    return true;
}
private class MyAsyncTask extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... arg0) {
        DefaultHttpClient httpCl = new DefaultHttpClient(new    

   BasicHttpParams());
        HttpPost httpP = new HttpPost(jsonUrl);
        httpP.setHeader("Content-type", "application/json");
        InputStream in = null;
        String result = null;
        try {
            HttpResponse response = httpCl.execute(httpP);
            HttpEntity entity = response.getEntity();
            in = entity.getContent();
            BufferedReader reader = new BufferedReader(new 
                                            InputStreamReader(in, "UTF-8"), 8);
            StringBuilder sbuilder = new StringBuilder();

            String line = null;

            while ((line = reader.readLine()) != null) {
                sbuilder.append(line + "\n");
            }
            result = sbuilder.toString();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {
                if(in != null)
                    in.close();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }


        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub

        if(!TextUtils.isEmpty(result))
        {
        JSONObject jsonObj;
        try {
            jsonObj = new JSONObject(result);
            gold = jsonObj.getString("gold");
        }
        catch (JSONException e) {
            e.printStackTrace();
        } 
        TextView goldTV = (TextView)findViewById(R.id.goldPrice);
        goldTV.setText("good price with Json" + gold);
        }
        else
        {
           Toast.makeText(this,"response is null",Toast.LENGTH_LONG);
        }
        super.onPostExecute(result);
    }



}
}
于 2013-11-03T07:36:14.430 回答