2013-05-07 77 views
0

一個JSON文件我有一個JSON文件看起來像這樣我對Android和JSON解析都很陌生。所以,請你能檢查一下我解析這種JSON的進展。這裏是我的功能是:解析在Android應用程序

@SuppressWarnings("null") 
    public String[] parseJSON(String URL) 
    { 
     String[] finals = null; 
     JSONArray results = null; 
     String TAG_RESULTS = "d"; 

     // Creating JSON Parser instance 
     JSONParser jParser = new JSONParser(); 

     // getting JSON string from URL 
     JSONObject json = jParser.getJSONFromUrl(URL); 

     try { 
      results = json.getJSONArray(TAG_RESULTS); 
      JSONArray tenResults = results.getJSONArray(0); 

      for(int i = 0; i < tenResults.length(); i++){ 
       JSONArray c = tenResults.getJSONArray(i); 
       String content = c.toString(); 
       content.substring(content.indexOf("\\u003Cb\\u003E ")+"\\u003Cb\\u003E ".length(), content.indexOf("\\u003C\\/b")); 
       finals[i] = content; 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return finals; 
    } 

我試圖調試應用程序,但我不能因爲一些源文件丟失的錯誤,我不能做的意義伸入try塊。據我所見,它成功創建JSONParser對象。

編輯: logcat的

05-07 12:17:02.562: E/AndroidRuntime(6007): FATAL EXCEPTION: main 
05-07 12:17:02.562: E/AndroidRuntime(6007): java.lang.IllegalStateException: Could not execute method of the activity 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at android.view.View$1.onClick(View.java:3597) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at android.view.View.performClick(View.java:4202) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at android.view.View$PerformClick.run(View.java:17340) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at android.os.Handler.handleCallback(Handler.java:725) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at android.os.Looper.loop(Looper.java:137) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at dalvik.system.NativeStart.main(Native Method) 
05-07 12:17:02.562: E/AndroidRuntime(6007): Caused by: java.lang.reflect.InvocationTargetException 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at android.view.View$1.onClick(View.java:3592) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  ... 11 more 
05-07 12:17:02.562: E/AndroidRuntime(6007): Caused by: android.os.NetworkOnMainThreadException 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at java.net.InetAddress.getAllByName(InetAddress.java:214) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at com.example.googlesearch.JSONParser.getJSONFromUrl(JSONParser.java:38) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at com.example.googlesearch.AuxilaryVerbs.parseJSON(AuxilaryVerbs.java:39) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  at com.example.googlesearch.AuxilaryVerbs.is_clicked(AuxilaryVerbs.java:81) 
05-07 12:17:02.562: E/AndroidRuntime(6007):  ... 14 more 
05-07 12:17:02.572: D/dalvikvm(6007): GC_CONCURRENT freed 439K, 9% free 5623K/6176K, paused 3ms+0ms, total 6ms 
+0

請添加異常消息。 – nfirex 2013-05-07 12:10:55

回答

0

EDIT2 我幾乎猜到 - NetworkOnMainThreadException。將代碼移到不同的線程上。我建議使用AsyncTask

編輯

如果try塊之前,應用程序崩潰,那麼很可能你已經錯過了這個權限添加到您的清單:

<uses-permission android:name="android.permission.INTERNET" /> 

還,您需要改變這一行

content.substring(content.indexOf("\\u003Cb\\u003E ")+"\\u003Cb\\u003E ".length(), content.indexOf("\\u003C\\/b")); 

這個

content = content.substring(content.indexOf("\\u003Cb\\u003E ")+"\\u003Cb\\u003E ".length(), content.indexOf("\\u003C\\/b")); 

該方法不影響字符串的當前實例,但返回一個新的字符串。

+0

我的應用程序仍然崩潰。我猜這個解析器有問題。 – 2013-05-07 12:09:44

+0

好吧,將logcat添加到您的問題將會很有用。 – mihail 2013-05-07 12:11:25

+0

良好的互聯網接入權限!是的,日誌貓會很棒。 – 2013-05-07 12:16:28

0

爲什麼不讓自己變得更簡單,並使用Gson?基於您的代碼我敲了一個快速的樣品:

創建一個POJO來表示你的模型:

public class Result { 

    @SerializedName("e") 
    public String e; 

    @SerializedName("c") 
    public int c; 

    @SerializedName("u") 
    public String u; 

    @SerializedName("p") 
    public boolean p; 

    @SerializedName("d") 
    public String[] d; 

} 

現在從JSON字符串創建一個實例

String json = "//some json string//"; 
Gson gson = new Gson(); 
Result result = gson.fromJson(json, Result.class); 

//do something with result 
if(result.p) 
{ 
    //argh we have a "p" 
} 

//or maybe we iterate over the strings you were after 
for(String myString : result.d) 
{ 
    //do something with myString which might be set to "evil" etc 
} 
+0

確保您正在異步執行所有這些操作,否則您的應用程序可能會掛起並導致ANR錯誤。任何下載和解析等... – 2013-05-07 12:10:17

+0

我仍然需要讓我的JSONParser類獲得JSON嗎? – 2013-05-07 12:15:55

+0

這取決於你如何得到Json,我會使用類似於AQuery(AndroidQuery)的東西,因爲它使這個變得簡單,並且你可以將你的解析代碼添加到回調中,因此使整個事情變得異步。 https://code.google.com/p/android-query/ - 請參閱ajax文檔。 – 2013-05-07 12:20:46

0

d:"[ ... ]"不是JSONArray但是String

您需要獲取該字符串並再次解析爲JSON。

+0

你能建議我一種檢索該字符串的方法嗎?我比分析整個JSON文件更適合解析字符串。 – 2013-05-07 12:14:18

0

我認爲你必須在該字符串的問題:

String[] finals = null; 

不創建字符串數組但在循環使用它:

finals[i] = content; 

在這種情況下,我可以reccomend你使用ArrayList

List<String> finals = new ArrayList<String>(); 
... 
finals.add(content); 

而且你的方法可以返回List<String>,但如果您需要Array,您可以將其轉換爲:

String[] array = new String[finals.size()]; 
finals.toArray(array); 

return array; 
+0

謝謝你指出,我錯過了。但它仍然不起作用。 – 2013-05-07 12:23:00

+0

@MertToka,也許這是你的主要問題:http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception – nfirex 2013-05-07 12:24:23