解析JSONObjects和JSONArray的最佳方式
所以即时通讯试图找出解析下面的JSON URL的最有效方法,我将在Android上使用Java进行此操作。解析JSONObjects和JSONArray的最佳方式
JSONParser.java
public class JSONParser {
private static final Context context = null;
static InputStream is = null;
static JSONObject jarray = null;
static JSONArray jarray2 = null;
static String json = "";
// constructor
public JSONParser() {
}
public JSONObject getJSONFromUrl2(String url) {
StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
//Recommended by Ted Hopp
return new JSONObject(builder.toString());
} else {
Log.e("==>", "No Response, Check Your API KEY");
Toast.makeText(context,"Error Response, Check your API Key", Toast.LENGTH_LONG).show();
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} catch (JSONException e) {
Log.e("JSON Parser Activity", url + e.toString());
}
// return JSON String
return null;
}
现在主要ISSUE IM已经在使用我的JSONParser活动的一部分,2解析的JSONObject。
https://api.company.com/api/systems/165756/summary?&key=e1e63de7276b04c9bb99adfd45b3a14c
返回以下JSON
{
"energy_month": 31132,
"current_power": 1963,
"modules": 24,
"energy_today": 1577,
"system_id": 165756,
"energy_week": 215504,
"source": "microinverters",
"energy_lifetime": 1545467,
"summary_date": "2013-05-03T00:00:00-07:00"
}
protected ArrayList<String> doInBackground(final String... args) {
JSONParser jParser = new JSONParser();
arrfortextviews=new ArrayList<String>();
JSONObject json2 = jParser.getJSONFromUrl2(https://api.company.com/api/systems/165756/summary?&key=e1e63de7276b04c9bb99adfd45b3a14c);
//Added due to for some reason index return has more than 1
for (int i = 0; i < json2.length(); i++) {
try {
Log.e("JSON Parser", summary + args.toString());
String current_power = json2.getString(TAG_CURRENT_POWER);
String energy_lifetime = json2.getString(TAG_ENERGY_LIFETIME);
但是这个当前的代码我碰到下面的错误。
05-03 11:31:59.765: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0
05-03 11:31:59.765: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0
05-03 11:31:59.780: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0
05-03 11:31:59.780: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0
05-03 11:31:59.785: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0
05-03 11:31:59.785: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0
05-03 11:31:59.790: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0
05-03 11:31:59.790: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0
05-03 11:31:59.790: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0
05-03 11:31:59.895: E/SpannableStringBuilder(30625): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
05-03 11:31:59.895: E/SpannableStringBuilder(30625): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
看看JSONObject
这个课。它是标准Android发行版的一部分。
JSONObject thing = new JSONObject(jsonString);
然后你只需要导航的thing
对象结构来得到你需要的数据:由于代码可以很简单。
你getJSONFromUrl2
方法看起来是这样的:
public JSONObject getJSONFromUrl2(String url) {
StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
return new JSONObject(builder.toString());
} else {
Log.e("==>", "No Response, Check Your API KEY");
Toast.makeText(context,"Error Response, Check your API Key", Toast.LENGTH_LONG).show();
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
Log.e("JSON Parser", json + url + e.toString());
}
return null; // only gets here on an error
}
它遗漏了一点错误处理,但因为你原来的代码也失踪了,我假设的工作,你最终会做反正。
感谢您的答案,我有一个JSONParser活动即时通讯使用,我上面张贴。现在的问题是我不能解析JSONObject与我的JSONParser活动的第二部分使用'getJSONFromUrl2'而不是'getJSONFromUrl'解析JSONObject – 2013-05-03 15:35:17
@JaisonBrooksDevelopment - 你似乎已经注释了解析的代码。为什么你不能解析对象?你有没有试过简单的'返回新的JSONObject(builder.toString());'在'try'块中? – 2013-05-03 16:20:45
你的意思是这样的' \t \t尝试{\t \t \t \t // JSONObject的jobj2 =新的JSONObject(builder.toString()); \t \t \t return new JSONObject(builder.toString()); \t \t \t // jarray = jobj2。getJSONObject( “摘要”); \t \t}赶上(JSONException E){ \t \t} \t \t //返回JSON字符串 \t \t返回jobj2; ' – 2013-05-03 16:58:21
您可以使用google提供的Volley库。
它有许多好处,如缓存,内存管理和排队请求。
您可以在这里找到一个最好的解决方案:
http://www.androidhive.info/2014/05/android-working-with-volley-library-1/
感谢这个资源。我通过使用GSON发现了一个解决方案。但是Volley听起来很好用。你有很多经验吗? – 2014-10-17 18:51:26
我会建议不要在该请求被做了相同的异步任务解析JSON。 AsyncTask的响应和你的活动之间的一个层可以有更精细的错误处理,跨请求代码重用,以及记录连接问题,服务器错误,JSON解析错误等。 – 2013-05-03 15:20:49
@iambmelton我更新了我的代码 - 你介意采取第二次看 – 2013-05-03 15:40:31