2013-05-07 81 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