这是我在Stackoverflow上的第一篇文章,我正在尝试学习Android。我需要从Android应用程序中读取一个json文件。
我在手机上运行了以下代码,它在手机上没有显示任何内容,我只是得到一个空白屏幕。
我知道有很多方法可以使用Java库来解析json,但这不是我想要的。我想使用Android提供的ONLY工具来完成阅读这个json。这是我的json
我使用的是Android 4.0.3 这是我的json文件数据:
{
"offers": [
{
"id": "1",
"type":"xyz",
"description":"blah blah",
"url":"http://www.example.com/"
},
{
"id": "1",
"type":"xyz",
"description":"some description",
"url":"http://www.example.com/"
},
{
"id": "1",
"type":"xyz",
"description":"some description",
"url":"http://www.example.com/"
}
]
}
这是我的MainActivity.java
package com.pega.parsejson;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
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;
import android.widget.Toast;
public class MainActivity extends Activity {
TextView jsonWrapper;
HttpClient httpClient;
JSONObject json;
final static String offersUrl="http://somewebsite.com/offers.json";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
jsonWrapper=(TextView) findViewById(R.id.jsonWrap);
httpClient=new DefaultHttpClient();
new Read().execute("description");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public JSONObject jsonOffers() throws ClientProtocolException, IOException, JSONException {
//StringBuilder url=new StringBuilder(offersUrl);
HttpGet get=new HttpGet(offersUrl);
HttpResponse res=httpClient.execute(get);
int status=res.getStatusLine().getStatusCode();
if(status==200){
HttpEntity e=res.getEntity();
String data=EntityUtils.toString(e);
JSONArray timeline=new JSONArray("offers");
JSONObject jsonOffer=timeline.getJSONObject(0); //returns most recent offer
return jsonOffer;
}else{
Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_SHORT).show();
return null;
}
}
public class Read extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... params) {
try {
json=jsonOffers();
return (String) json.get("description"); //returns string w/ parameter passed in as "description"
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
jsonWrapper.setText(result);
}
}
}
我也在使用INTERNET PERMISSIONS:
这是我的清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.pega.parsejson"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.pega.parsejson.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
以下是我的文本视图:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/jsonWrap"
android:layout_width="match_parent"
android:layout_height="400dp"
android:text="" />
</RelativeLayout>
这是我的logcat:
[2013-08-07 23:35:41 - parseJson] ------------------------------
[2013-08-07 23:35:41 - parseJson] Android Launch!
[2013-08-07 23:35:41 - parseJson] adb is running normally.
[2013-08-07 23:35:41 - parseJson] Performing com.pega.parsejson.MainActivity activity launch
[2013-08-07 23:35:42 - parseJson] Uploading parseJson.apk onto device 'HT25EHX00690'
[2013-08-07 23:35:42 - parseJson] Installing parseJson.apk...
[2013-08-07 23:35:45 - parseJson] Success!
[2013-08-07 23:35:45 - parseJson] Starting activity com.pega.parsejson.MainActivity on device HT25EHX00690
[2013-08-07 23:35:46 - parseJson] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.pega.parsejson/.MainActivity }
请注意我不想使用任何json库来解析我的json,我严格地想使用ONLY来解析json。我只是不明白为什么我的mainActivity.java没有在手机上显示任何内容。
为我的帖子的长度道歉,对于时间敏感的项目真的需要帮助,是的,我已经在Stackoverflow上阅读了其他类似的问题,似乎没有人回答这个问题。
有人可以帮我解决这个问题吗?
由于
答案 0 :(得分:1)
尝试这样的事情:
if(status==200){
HttpEntity e=res.getEntity();
String data=EntityUtils.toString(e);
JSONObject jObj;
JSONArray data = null;
JSONObject jsonOffer;
jObj = new JSONObject(data);
data = jObj.getJSONArray("offers");
jsonOffer=data.getJSONObject(0);
return jsonOffer;
}
获取类似
的值String id = jsonOffer.getString("id");
我们为你的json创建了json对象。然后我们得到了“优惠”键下的数组。所以我们将数据作为数组。然后我们在jsonoffer对象中得到了数组的第一个对象。所以我们在jsonoffer中有数据,我们可以通过getString(keyName)检索值。
希望它能帮助!!
答案 1 :(得分:0)
执行以下操作,
public class Read extends AsyncTask<String, Integer, JSONObject>{
@Override
protected JSONObjectdoInBackground(String... params) {
try {
json=jsonOffers();
return json;
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(JSONObject result) {
try {
JSONArray offers=result.getJSONArray("offers");
for(int i=0;i<offers.length();i++)
{
JSONObject obj1=offers.getJSONObject(0);
String desc1=obj1.getString("description");
JSONObject obj2=offers.getJSONObject(1);
String desc2=obj2.getString("description");
JSONObject obj3=offers.getJSONObject(2);
String desc3=obj3.getString("description");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
现在String
desc1,desc2,desc3分别包含3个描述。用string
做你想做的事。
答案 2 :(得分:0)
我相信你的错误在于代码:
HttpEntity e=res.getEntity();
String data=EntityUtils.toString(e);
JSONArray timeline=new JSONArray("offers");
JSONObject jsonOffer=timeline.getJSONObject(0); //returns most recent offer
return jsonOffer;
原因是您正在创建一个新的JSONArray,而不是使用您收到的JSON中的数组。
相反,您应该使用内置的JSONObject解析收到的JSON,然后选择数组。假设data
包含JSON文本,您可以执行以下操作:
JSONObject json = new JSONObject(data);
JSONArray timeline = json.getJSONArray("offers");
return timeline.getJSONObject(0); // return most recent offer