我从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
。我无法弄明白为什么?谁能告诉我出了什么问题?
感谢
更新 添加了屏幕截图:
答案 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值。 通过这两个教程,您将了解: -
答案 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();
}