2013-05-16 72 views
0

我在線JSON文件看起來像這樣:閱讀在線JSON的Android

{ 
    "iPadVersion": "1.0", 
    "AndroidVersion": "1.0" 
} 

我想這樣的閱讀,(這部分代碼是的AsyncTask):

JSONParser jParser = new JSONParser(); 
JSONObject json = jParser.getJSONFromUrl("http://mylink/db.json"); 
String str = "tmp"; 

      try { 
        str = json.getString("AndroidVersion"); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


      Log.d(TAG, ""+str); 

我在log.d中總是得到「tmp」,但它不起作用。

StactTrace:

05-16 12:54:08.605: W/System.err(20406): java.io.FileNotFoundException: /http:/mylink/db.json: open failed: ENOENT (No such file or directory) 
    05-16 12:54:08.605: W/System.err(20406): at libcore.io.IoBridge.open(IoBridge.java:406) 
    05-16 12:54:08.605: W/System.err(20406): at java.io.FileInputStream.<init>(FileInputStream.java:78) 
    05-16 12:54:08.605: W/System.err(20406): at java.io.FileInputStream.<init>(FileInputStream.java:105) 
    05-16 12:54:08.605: W/System.err(20406): at java.io.FileReader.<init>(FileReader.java:66) 
    05-16 12:54:08.605: W/System.err(20406): at com.weterworks.JSONParser.getJSONFromUrl(JSONParser.java:37) 
    05-16 12:54:08.605: W/System.err(20406): at com.weterworks.MainActivity$sync.<init>(MainActivity.java:359) 
    05-16 12:54:08.605: W/System.err(20406): at com.weterworks.MainActivity.onCreate(MainActivity.java:263) 
    05-16 12:54:08.605: W/System.err(20406): at android.app.Activity.performCreate(Activity.java:4465) 
    05-16 12:54:08.605: W/System.err(20406): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
    05-16 12:54:08.605: W/System.err(20406): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
    05-16 12:54:08.605: W/System.err(20406): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
    05-16 12:54:08.605: W/System.err(20406): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
    05-16 12:54:08.605: W/System.err(20406): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
    05-16 12:54:08.605: W/System.err(20406): at android.os.Handler.dispatchMessage(Handler.java:99) 
    05-16 12:54:08.605: W/System.err(20406): at android.os.Looper.loop(Looper.java:137) 
    05-16 12:54:08.605: W/System.err(20406): at android.app.ActivityThread.main(ActivityThread.java:4424) 
    05-16 12:54:08.605: W/System.err(20406): at java.lang.reflect.Method.invokeNative(Native Method) 
    05-16 12:54:08.615: W/System.err(20406): at java.lang.reflect.Method.invoke(Method.java:511) 
    05-16 12:54:08.615: W/System.err(20406): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    05-16 12:54:08.615: W/System.err(20406): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    05-16 12:54:08.615: W/System.err(20406): at dalvik.system.NativeStart.main(Native Method) 
    05-16 12:54:08.615: W/System.err(20406): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory) 
    05-16 12:54:08.615: W/System.err(20406): at libcore.io.Posix.open(Native Method) 
    05-16 12:54:08.615: W/System.err(20406): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 
    05-16 12:54:08.615: W/System.err(20406): at libcore.io.IoBridge.open(IoBridge.java:390) 
    05-16 12:54:08.615: W/System.err(20406): ... 20 more 
    05-16 12:54:08.615: W/System.err(20406): org.json.JSONException: No value for AndroidVersion 
    05-16 12:54:08.615: W/System.err(20406): at org.json.JSONObject.get(JSONObject.java:354) 
    05-16 12:54:08.615: W/System.err(20406): at org.json.JSONObject.getString(JSONObject.java:510) 
    05-16 12:54:08.615: W/System.err(20406): at com.weterworks.MainActivity$sync.doInBackground(MainActivity.java:404) 
    05-16 12:54:08.615: W/System.err(20406): at com.weterworks.MainActivity$sync.doInBackground(MainActivity.java:1) 
    05-16 12:54:08.615: W/System.err(20406): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
    05-16 12:54:08.615: W/System.err(20406): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    05-16 12:54:08.625: W/System.err(20406): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    05-16 12:54:08.625: W/System.err(20406): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
    05-16 12:54:08.625: W/System.err(20406): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    05-16 12:54:08.625: W/System.err(20406): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
    05-16 12:54:08.625: W/System.err(20406): at java.lang.Thread.run(Thread.java:856) 

JsonParser類:

public class JSONParser { 

static InputStream is = null; 
static JSONObject jObj = null; 
static String json = ""; 

// constructor 
public JSONParser() { 

} 

public JSONObject getJSONFromUrl(String url) { 


    try { 
     BufferedReader reader = new BufferedReader(new FileReader(url)); 
     String line, results = ""; 
     while ((line = reader.readLine()) != null) { 
      results += line; 
     } 
     reader.close(); 

     jObj = new JSONObject(results); 
    } catch (FileNotFoundException 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 jObj; 

} 

}

+0

post stacktrace – njzk2

+0

你確定json不是null嗎? – Nermeen

+0

那麼,你肯定在這裏使用某種自定義類,發佈'com.weterworks.JSONParser'的代碼,特別是'getJSONFromUrl'方法。 – Perception

回答

2

您正在嘗試從URL中讀取數據,但在流鏈中使用的是FileReader。這根本行不通,因爲FileReader將其字符串參數解釋爲本地系統上的文件(請參閱Javadoc)。

您需要做的是使用HTTP庫從給定URL下載數據,然後將其解析爲JSON對象。我在下面的例子中,使用內置的HTTP類的SDK:

public class JSONParser { 
    private static final String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"; 

    public JSONObject getJSONFromUrl(String url) { 

     try { 
      final HttpURLConnection connection = (HttpURLConnection) new URL(
        url).openConnection(); 
      connection.setRequestProperty("User-Agent", USER_AGENT); 

      if (connection.getResponseCode() == 200) { 
       final BufferedReader reader = new BufferedReader(
         new InputStreamReader(connection.getInputStream())); 

       String line = null; 
       final StringBuffer buffer = new StringBuffer(4096); 
       while ((line = reader.readLine()) != null) { 
        buffer.append(line); 
       } 
       reader.close(); 

       final JSONObject jObj = new JSONObject(buffer.toString()); 
       return jObj; 
      } else { 
       return null; 
      } 

     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } catch (JSONException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

邊注:而不是創建這個你自己的分析工具中,您可以在您的項目Jackson,並使用此一班輪:

final JsonNode jsonObj = new ObjectMapper().readTree(new URL(
     "http://www.example.com/json")); 
0

檢查您的服務器的鏈接,並正確地使用它。我想,你有服務器URL的問題。 記錄您的url字符串並嘗試通過瀏覽器獲取它。

+0

它工作得很好 – Dim