我的Android JSON解析器不起作用,为什么?

时间:2013-11-03 07:20:03

标签: android json parsing

我从here获得了非常简单的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。我无法弄明白为什么?谁能告诉我出了什么问题? 感谢

更新 添加了屏幕截图: enter image description here

3 个答案:

答案 0 :(得分: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 Tutorial from Local

Json Tutorial from URL

答案 1 :(得分: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);
    }



}
}

答案 2 :(得分:1)

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

JSONArray jsonArray;
JSONObject parent;
    try {
        jsonArray = new JSONArray(result);
        parent = jsonArray.getJsonObject("ParentObject");
        gold = parent.getString("gold");
    }
    catch (JSONException e) {
        e.printStackTrace();
    }