2013-02-20 2 views
3

this tutorial을 기본으로 사용하여 Redmine API에서 생성 된 일부 JSON을 GSON으로 구문 분석하려고합니다. 불행하게도 그것은 단지 내부적으로 작동하기 때문에 나는 내 JSON 당신에게 URL을 줄 수 있지만 다음과 같습니다Android에서 GSON을 사용하여 JSON 구문 분석

{ 
    "limit": 25, 
    "total_count": 653, 
    "offset": 0, 
    "time_entries": [ 
    { 
     "spent_on": "2013-02-14", 
     "activity": { 
     "name": "Blah1", 
     "id": 10 
     }, 
     "project": { 
     "name": "TEST", 
     "id": 10 
     }, 
     "id": 661, 
     "hours": 1, 
     "updated_on": "2013-02-14T14:32:19Z", 
     "user": { 
     "name": "USER1", 
     "id": 7 
     }, 
     "issue": { 
     "id": 467 
     }, 
     "comments": "COMMENT 1", 
     "created_on": "2013-02-14T14:32:19Z" 
    }, 
    { 
     "spent_on": "2013-02-14", 
     "activity": { 
     "name": "Bla2", 
     "id": 10 
     }, 
     "project": { 
     "name": "TEST TEST", 
     "id": 10 
     }, 
     "id": 660, 
     "hours": 1, 
     "updated_on": "2013-02-14T11:52:13Z", 
     "user": { 
     "name": "USER2", 
     "id": 4 
     }, 
     "issue": { 
     "id": 466 
     }, 
     "comments": "COMMENT 2.", 
     "created_on": "2013-02-14T11:52:13Z" 
    } 
    ] 
} 

나는 NullPointerException 얻을하지만이 JSON 또는 모델링을 얻기 위해 실패에서입니다 있는지 확실하지 않습니다 그것은 틀렸다. 나는 내부 수업과 관련이없는 것을 걱정하고 있습니다. JSON이 잘못 가져온 것처럼 간단하다면 나 자신에게 정말 짜증이납니다.

내 장치는 모두 내부 네트워크에 연결된 WIFI로 실행되며 브라우저를 사용할 때 JSON이 표시되어 네트워킹 문제가 아닌 것 같습니다.

02-20 21:11:11.175: E/AndroidRuntime(14450): FATAL EXCEPTION: main 
02-20 21:11:11.175: E/AndroidRuntime(14450): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.javacodegeeks.android.json/com.javacodegeeks.android.json.JsonParsingActivity}: java.lang.NullPointerException 
02-20 21:11:11.175: E/AndroidRuntime(14450): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at android.os.Looper.loop(Looper.java:137) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at android.app.ActivityThread.main(ActivityThread.java:5041) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at java.lang.reflect.Method.invokeNative(Native Method) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at java.lang.reflect.Method.invoke(Method.java:511) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at dalvik.system.NativeStart.main(Native Method) 
02-20 21:11:11.175: E/AndroidRuntime(14450): Caused by: java.lang.NullPointerException 
02-20 21:11:11.175: E/AndroidRuntime(14450): at com.javacodegeeks.android.json.JsonParsingActivity.onCreate(JsonParsingActivity.java:46) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at android.app.Activity.performCreate(Activity.java:5104) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
02-20 21:11:11.175: E/AndroidRuntime(14450): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 

JsonParsingActivity :

public class JsonParsingActivity extends Activity { 

    String url = "URL"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     InputStream source = retrieveStream(url); 
     Gson gson = new Gson(); 
     Reader reader = new InputStreamReader(source); 
     RedmineResponse response = gson.fromJson(reader, RedmineResponse.class); 

     Toast.makeText(this, response.query, Toast.LENGTH_SHORT).show(); 

     List<Result> results = response.results; 
     for (Result result : results) { 
      if (result.comments != null) { 
       Toast.makeText(this, result.comments, Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(this, "EMPTY", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    private InputStream retrieveStream(String url) { 
     DefaultHttpClient client = new DefaultHttpClient(); 
     HttpGet getRequest = new HttpGet(url); 

     try { 
      HttpResponse getResponse = client.execute(getRequest); 
      final int statusCode = getResponse.getStatusLine().getStatusCode(); 

      if (statusCode != HttpStatus.SC_OK) { 
       Log.w(getClass().getSimpleName(), "Error " + statusCode + " for URL " + url); 
       return null; 
      } 

      HttpEntity getResponseEntity = getResponse.getEntity(); 
      return getResponseEntity.getContent(); 
     } catch (IOException e) { 
      getRequest.abort(); 
      Log.w(getClass().getSimpleName(), "Error for URL " + url, e); 
     } 

     return null; 
    } 
} 

Result 클래스 :

public class Result { 

    @SerializedName("id") 
    public String time_entry_ID; 

    @SerializedName("spent_on") 
    public String spent_on; 

    @SerializedName("created_on") 
    public String created_on; 

    public Project project; 

    @SerializedName("hours") 
    public String hours; 

    @SerializedName("comments") 
    public String comments; 

    @SerializedName("iso_language_code") 
    public String isoLanguageCode; 

    @SerializedName("to_user_id_str") 
    public String toUserIdStr; 

    public String source; 
} 

RedmineResponse 클래스 :

여기

내 로그 캣인가

Activity 클래스 :

public class Activity { 

    @SerializedName("id") 
    public String activity_ID; 

    @SerializedName("name") 
    public String activity_name; 
} 

Issue 클래스 :

public class Issue { 

    @SerializedName("id") 
    public String issue_ID; 
} 

Project 클래스 :

public class Issue { 

    @SerializedName("id") 
    public String issue_ID; 
} 

User 클래스 :

public class User { 

    @SerializedName("id") 
    public String user_ID; 

    @SerializedName("name") 
    public String user_name; 
} 
+1

json의 유효성을 검사하려면 [this json validator] (http://jsonlint.com/)와 같은 것을 사용하십시오. 괜찮아 보인다. –

+2

'List results = response.results' <--- 결과가 null이 아닌 것은 확실합니까? 그것이 내가 당신이 문제가 있다고 생각하는 곳입니다. – Pete

+0

json이 잘 보이는지 확인하고 활동에 나열된 URL도 외부에서 액세스 할 수 있습니다. –

답변

3

당신은 당신의 RedmineResponse 매핑에 results 컬렉션에 대한 직렬화 된 속성 이름을 정의해야

public class RedmineResponse { 

    @SerializedName("time_entries") // This is the name you are using in JSON 
    public List<Result> results; 
} 

완성 된 접선으로, 그 더 나은 게터/세터와 자바 빈즈 (일명 private 변수에 속성을 정의합니다) 이것이 캡슐화에 도움이되기 때문에.

+0

감사합니다! 그것은 그것을 고쳤다. 내 속성을 변경하는 방법을 살펴 보겠습니다. 다시 한 번 감사드립니다. – ThrowingSpoon

관련 문제