2016-05-09 7 views
-3

アンドロイドアプリの起動時にサーバーから取得する設定ファイルがあります。 ファイルを取得するためのコードは、ファイルの解析中に、私は奇妙な例外を取得しています静的なjsonを解析する際のAndroidの例外

@Override 
protected void onResume() { 
    super.onResume(); 
    new ConnectionTask().execute(); 
} 
private class ConnectionTask extends AsyncTask<String, String, String> { 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected String doInBackground(String... args) { 
     String result = null; 
     AuthenticateConnection mAuth1 = new AuthenticateConnection(); 
     try { 
      result = mAuth1.connection(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String str) { 
     if (!isFinishing() && !isDestroyed()) { 
      if (!TextUtils.isEmpty(str)) { 
       Log.e("str", "" + str); 
       /****** The below line crashes*******/ 
       BaseUrl obj = new Gson().fromJson(str, BaseUrl.class); 
       /****** The above line crashes*******/ 
       //Some Logic here 
      } 
     } 
    } 
} 

private class AuthenticateConnection { 

    public AuthenticateConnection() { 
    } 

    public String connection() throws Exception { 
     String str = ""; 
     try { 
      // Create a URL for the desired page 
      if (!TextUtils.isEmpty(getApplicationContext().getResources().getString(R.string.configuration_url))) { 
       String aUrl = getApplicationContext().getResources().getString(R.string.configuration_url); 
       URL url = new URL("http://" + aUrl); 
       str = convertStreamToString(url.openStream()); 
      } else { 
       str = ""; 
      } 
     } catch (MalformedURLException e) { 
     } catch (IOException e) { 
     } 
     return str; 
    } 

    public String convertStreamToString(InputStream is) { 
     BufferedReader reader = null; 
     try { 
      reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
     StringBuilder sb = new StringBuilder(); 

     String line = null; 
     try { 
      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } finally { 
      try { 
      is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return sb.toString(); 
    } 
} 

かなり標準です。私と私のチームはすべての単体テストでこのエラーに遭遇していませんが、Crashlyticsはこの例外に直面している多くのユーザーを報告しています。ここではonPostExecute()、jsonの解析中です。BaseUrl obj = new Gson()。fromJson(str、BaseUrl 。クラス);

この例外が発生する可能性がある原因は何か。

Fatal Exception: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(SourceFile:200) 
     at com.google.gson.Gson.fromJson(SourceFile:810) 
     at com.google.gson.Gson.fromJson(SourceFile:775) 
     at com.google.gson.Gson.fromJson(SourceFile:724) 
     at com.google.gson.Gson.fromJson(SourceFile:696) 
     at com.myapp.activity.Splash$ConnectionTask.onPostExecute(SourceFile:263) 
     at com.myapp.activity.Splash$ConnectionTask.onPostExecute(SourceFile:237) 
     at android.os.AsyncTask.finish(AsyncTask.java:632) 
     at android.os.AsyncTask.access$600(AsyncTask.java:177) 
     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5095) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
     at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ 
     at com.google.gson.stream.JsonReader.beginObject(SourceFile:387) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(SourceFile:189) 
     at com.google.gson.Gson.fromJson(SourceFile:810) 
     at com.google.gson.Gson.fromJson(SourceFile:775) 
     at com.google.gson.Gson.fromJson(SourceFile:724) 
     at com.google.gson.Gson.fromJson(SourceFile:696) 
     at com.myapp.activity.Splash$ConnectionTask.onPostExecute(SourceFile:263) 
     at com.myapp.activity.Splash$ConnectionTask.onPostExecute(SourceFile:237) 
     at android.os.AsyncTask.finish(AsyncTask.java:632) 
     at android.os.AsyncTask.access$600(AsyncTask.java:177) 
     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5095) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
     at dalvik.system.NativeStart.main(NativeStart.java) 

それはコンフィギュレーションファイルに格納されている基準JSONは以下の通りであり、そしてBaseUrl.javaこのJSONに準拠:

{ "baseUrls": [{ 
    "versionCode": 10, 
    "baseUrl": "http://myapp.in", 
    "infra": "staging" 
},{ 
     "versionCode": 11, 
     "baseUrl": "http://myapp.in", 
     "infra": "production" 
}] 
} 

質問に対するBaseUrl.java追加:

public class BaseUrl implements Parcelable { 

    ArrayList<VersionControl> baseUrls; 

    public ArrayList<VersionControl> getBaseUrls() { 
     return baseUrls; 
    } 

    public void setBaseUrls(ArrayList<VersionControl> baseUrls) { 
     this.baseUrls = baseUrls; 
    } 

    protected BaseUrl(Parcel in) { 
     if (in.readByte() == 0x01) { 
      baseUrls = new ArrayList<VersionControl>(); 
      in.readList(baseUrls, VersionControl.class.getClassLoader()); 
     } else { 
      baseUrls = null; 
     } 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     if (baseUrls == null) { 
      dest.writeByte((byte) (0x00)); 
     } else { 
      dest.writeByte((byte) (0x01)); 
      dest.writeList(baseUrls); 
     } 
    } 

    @SuppressWarnings("unused") 
    public static final Parcelable.Creator<BaseUrl> CREATOR = new Parcelable.Creator<BaseUrl>() { 
     @Override 
     public BaseUrl createFromParcel(Parcel in) { 
      return new BaseUrl(in); 
     } 

     @Override 
     public BaseUrl[] newArray(int size) { 
      return new BaseUrl[size]; 
     } 
    }; 
} 
+0

この行をlogcat 'Log.e(" str "、" str); 'から追加してください。str:' str: 'であると確信しています – Selvin

+0

[" BEGIN \ _OBJECT 1行目の列1でSTRINGでした」](http://stackoverflow.com/questions/28418662/expected-begin-object-but-was-string-at-line-1-column-1) – Gangaraju

+0

例外はあなたは@セルビンと言います。構文例外BaseUrl obj = new Gson()。fromJson(str、BaseUrl.class)が、json自体は有効なものです。 – Ichthyocentaurs

答えて

2

この場合、{ - オブジェクトの開始点それはあなたのウェブサーバが噴出することを警告する何らかのエラーである可能性が高い文字列を見ました。

は、このような

として応答メッセージを受信したAndroidのクライアントを想像してみて

の代わりに、有効なJSONを受け、「あなたはこの要求をすることが許可されていない」、それはここに原因として最も可能性が高いです。

+0

これは有効だったが、私が投稿したjsonは有効で、それは私たちのサーバーに置かれているものです。編集されたURLを – Ichthyocentaurs

+0

@AkshatAroraに貼り付けて、あなたの質問のJSONが無効であると言っているわけではありません。私は、あなたのサーバーがそのJSONで応答しないことがあり、実際にJSONを期待しているときに、代わりに文字列エラーメッセージで応答すると言っています。ここで問題を引き起こしているJSONを常に受け​​取ることを前提としています。JSONとしてエラーメッセージを自動的に印刷するウェブサーバーは多くありません。 – roarster

+0

私は上記の要求を実行しようとし、100の要求をサーバーにループし、常に有効なjsonで応答を得ました。 – Ichthyocentaurs

1

要求がサーバーに正しく送信されません。サーバーは正しいjsonを返す代わりに、文字列である何らかのエラーメッセージを返します。サーバーの応答を記録して、サーバーが何を返すかを確認する方が良いでしょう。

0

有効なJsonの代わりにサーバーからの応答が返ってくることがありますが、これは 'str'のログでチェックされます。あるいは、BaseUrl.javaにいくつかの問題があるかもしれないので、それを表示するほうがいいでしょう。

+0

私は答えにBaseUrl.javaを追加します。単体テストのログには常に有効なjsonが表示されます。 – Ichthyocentaurs

+0

と、あなたのVersionControl.java。 – vesper

関連する問題