2016-07-25 75 views
0

我想显示我的饲料CardViews在我的Recyclerview使用JSON和改造库。 我一直在研究这个问题4小时1小时,现在搜索谷歌,但仍然没有成功。IllegalStateException当试图解析JSON饲料与改造

无论我怎么努力,我得到以下错误:

D/Error: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ D/Error: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $


JSON来自实例PHP API:

[{"id":"143","uploadID":"36","type":"excellent","userID":"58","username":"doitlikeaves","date":"31 May","timestamp":"2016-05-31 22:37:50","title":"PH Zusammenfassung #2","subject":"Physik"},{"id":"142","uploadID":"36","type":"presentation","userID":"58","username":"doitlikeaves","date":"31 May","timestamp":"2016-05-31 21:57:21","title":"PH Zusammenfassung #2","subject":"Physik"},{"id":"141","uploadID":"61","type":"document","userID":"56","username":"maja","date":"31 May","timestamp":"2016-05-31 14:29:00","title":" Rev.","subject":"Geschichte"}] 


Android的文件:

FeedElement.js:

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

public class FeedElement { 

    @SerializedName("id") 
    @Expose 
    private String id; 
    @SerializedName("uploadID") 
    @Expose 
    private String uploadID; 
    @SerializedName("type") 
    @Expose 
    private String type; 
    @SerializedName("userID") 
    @Expose 
    private String userID; 
    @SerializedName("username") 
    @Expose 
    private String username; 
    @SerializedName("date") 
    @Expose 
    private String date; 
    @SerializedName("timestamp") 
    @Expose 
    private String timestamp; 
    @SerializedName("title") 
    @Expose 
    private String title; 
    @SerializedName("subject") 
    @Expose 
    private String subject; 

    /** 
    * 
    * @return 
    * The id 
    */ 
    public String getId() { 
     return id; 
    } 

    /** 
    * 
    * @param id 
    * The id 
    */ 
    public void setId(String id) { 
     this.id = id; 
    } 

    /** 
    * 
    * @return 
    * The uploadID 
    */ 
    public String getUploadID() { 
     return uploadID; 
    } 

    /** 
    * 
    * @param uploadID 
    * The uploadID 
    */ 
    public void setUploadID(String uploadID) { 
     this.uploadID = uploadID; 
    } 

    /** 
    * 
    * @return 
    * The type 
    */ 
    public String getType() { 
     return type; 
    } 

    /** 
    * 
    * @param type 
    * The type 
    */ 
    public void setType(String type) { 
     this.type = type; 
    } 

    /** 
    * 
    * @return 
    * The userID 
    */ 
    public String getUserID() { 
     return userID; 
    } 

    /** 
    * 
    * @param userID 
    * The userID 
    */ 
    public void setUserID(String userID) { 
     this.userID = userID; 
    } 

    /** 
    * 
    * @return 
    * The username 
    */ 
    public String getUsername() { 
     return username; 
    } 

    /** 
    * 
    * @param username 
    * The username 
    */ 
    public void setUsername(String username) { 
     this.username = username; 
    } 

    /** 
    * 
    * @return 
    * The date 
    */ 
    public String getDate() { 
     return date; 
    } 

    /** 
    * 
    * @param date 
    * The date 
    */ 
    public void setDate(String date) { 
     this.date = date; 
    } 

    /** 
    * 
    * @return 
    * The timestamp 
    */ 
    public String getTimestamp() { 
     return timestamp; 
    } 

    /** 
    * 
    * @param timestamp 
    * The timestamp 
    */ 
    public void setTimestamp(String timestamp) { 
     this.timestamp = timestamp; 
    } 

    /** 
    * 
    * @return 
    * The title 
    */ 
    public String getTitle() { 
     return title; 
    } 

    /** 
    * 
    * @param title 
    * The title 
    */ 
    public void setTitle(String title) { 
     this.title = title; 
    } 

    /** 
    * 
    * @return 
    * The subject 
    */ 
    public String getSubject() { 
     return subject; 
    } 

    /** 
    * 
    * @param subject 
    * The subject 
    */ 
    public void setSubject(String subject) { 
     this.subject = subject; 
    } 

} 

JSONResponseFeed.js:

import java.util.ArrayList; 
public class JSONResponseFeed { 
    private ArrayList<FeedElement> feeds; 

    /** 
    * @return The feeds 
    */ 
    public ArrayList<FeedElement> getFeed() { 
     return feeds; 
    } 
} 

RequestInterfaceFeed.js:

import retrofit2.Call; 
import retrofit2.http.GET; 
import retrofit2.http.Query; 

public interface RequestInterfaceFeed { 
    @GET("getFeed") 
    Call<JSONResponseFeed> getJSON(@Query("key") String apiKey); 
} 

DataAdapterFeed.js:

import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import java.util.List; 

public class DataAdapterFeed extends RecyclerView.Adapter<DataAdapterFeed.ViewHolder> { 
    private List<FeedElement> feed; 

public DataAdapterFeed(List<FeedElement> feed) { 
    this.feed = feed; 
} 

@Override 
public DataAdapterFeed.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false); 
    return new ViewHolder(view); 
} 

@Override 
public void onBindViewHolder(DataAdapterFeed.ViewHolder viewHolder, int i) { 

    viewHolder.tv_name.setText(feed.get(i).getUsername()); 
} 

@Override 
public int getItemCount() { 
    return feed.size(); 
} 

public class ViewHolder extends RecyclerView.ViewHolder{ 
    private TextView tv_name; 
    public ViewHolder(View view) { 
     super(view); 

     tv_name = (TextView)view.findViewById(R.id.username); 

     } 
    } 
} 

功能从MainActivity.js:

private void loadJSON(){ 
    final String url = "https://mydomainiscorrect.justreplacedithere/api/v1/"; 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(url) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
    final RequestInterfaceFeed request = retrofit.create(RequestInterfaceFeed.class); 
    Call<JSONResponseFeed> call = request.getJSON(apiKey); 
    call.enqueue(new Callback<JSONResponseFeed>() { 
     @Override 
     public void onResponse(Call<JSONResponseFeed> call, retrofit2.Response<JSONResponseFeed> response) { 
      List<FeedElement> data = response.body().getFeed(); 
      adapter = new DataAdapterFeed(data); 
      recyclerView.setAdapter(adapter); 
     } 

     @Override 
     public void onFailure(Call<JSONResponseFeed> call, Throwable t) { 
      Log.d("Error", t.getMessage()); 
     } 
    }); 
} 

private void initViews(){ 
    recyclerView = (RecyclerView)findViewById(R.id.card_recycler_view); 
    recyclerView.setHasFixedSize(true); 
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); 
    recyclerView.setLayoutManager(layoutManager); 
    loadJSON(); 
} 

如果需要的话 - cardView.xml:

<android.support.v7.widget.CardView 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_marginTop="5dp" 
android:layout_marginLeft="5dp" 
android:layout_marginRight="5dp" 
card_view:cardCornerRadius="5dp"> 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="10dp" 
    android:orientation="vertical"> 
    <TextView 
     android:id="@+id/username" 
     android:layout_marginTop="10dp" 
     android:layout_marginBottom="10dp" 
     android:textSize="18sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textStyle="bold" /> 
</LinearLayout> 


MainActivity RecyclerView XML:

<android.support.v7.widget.RecyclerView 
     android:id="@+id/card_recycler_view" 
     android:scrollbars="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 


我还是老样子很新,Java和Android的程序,我知道PHP不错,但Java的有板有眼我有时会头痛。

非常感谢你帮助我,我真的很感激!

+1

检查这个计算器线程,它可以帮助你。 http://stackoverflow.com/questions/9598707/gson-throwing-expected-begin-object-but-was-begin-array – lsiva

+0

@伊瓦希已经看到那个线程,但它只是让我想知道更多,不知道在哪里把什么答案说什么,甚至不知道我的代码实际上错了,因为我的应用程序不会崩溃:/ –

+0

检查我的答案http://stackoverflow.com/questions/38418556/expected-begin- array-but-was-begin-object-with-gson-and-retrofit/38418739#38418739 – USKMobility

回答

1

JSONResponseFeed。更新RequestInterfaceFeed

public interface RequestInterfaceFeed { 
    @GET("getFeed") 
    Call<List<FeedElement>> getJSON(@Query("key") String apiKey); 
} 

和更新loadJSON方法

private void loadJSON(){ 
    final String url = "https://mydomainiscorrect.justreplacedithere/api/v1/"; 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(url) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
    final RequestInterfaceFeed request = retrofit.create(RequestInterfaceFeed.class); 
    Call<List<FeedElement>> call = request.getJSON(apiKey); 
    call.enqueue(new Callback<List<FeedElement>>() { 
     @Override 
     public void onResponse(Call<List<FeedElement>> call, retrofit2.Response<List<FeedElement>> response) { 
      List<FeedElement> data = response.body(); 
      adapter = new DataAdapterFeed(data); 
      recyclerView.setAdapter(adapter); 
     } 

     @Override 
     public void onFailure(Call<List<FeedElement>> call, Throwable t) { 
      Log.d("Error", t.getMessage()); 
     } 
    }); 
} 
+0

非常感谢,这是正确的答案! –

0

我跟你类似的东西),但我通过继承有元素的列表

public class ListClubs extends LinkedList<Club> { 
} 

我的服务是这样的:

public interface ClubService { 

    @GET("/clubs") 
    Call<ListClubs> getClubs(); 

    @GET("/clubs/{id}") 
    Call<ClubDetail> getClub(@Path("id") String id); 

} 

这工作得很好。

如果你想你的代码工作我想你必须JSON看起来像:不需要

{feeds:[{"id":"143","uploadID":"36","type":"excellent","userID":"58","username":"doitlikeaves","date":"31 May","timestamp":"2016-05-31 22:37:50","title":"PH Zusammenfassung #2","subject":"Physik"},{"id":"142","uploadID":"36","type":"presentation","userID":"58","username":"doitlikeaves","date":"31 May","timestamp":"2016-05-31 21:57:21","title":"PH Zusammenfassung #2","subject":"Physik"},{"id":"141","uploadID":"61","type":"document","userID":"56","username":"maja","date":"31 May","timestamp":"2016-05-31 14:29:00","title":" Rev.","subject":"Geschichte"}]} 
+0

谢谢,我会查看它并像提供它一样格式化json –

+0

给ma发送一个“格式不正确的JSON”错误:/ –