【发布时间】:2019-07-14 13:49:11
【问题描述】:
我的 API 有嵌套的 json,我试图将它映射到 json 中,这样我就可以将它显示在片段中这是我来自服务器的 json 响应。 我的主要问题是将json对象映射到我的数据模式... 请尽可能提供帮助
[
{
"couponDate": "2019-07-14T11:34:09.482Z",
"couponComment": "GooD LucK :)",
"couponNumber": 1,
"_id": "5d2b134149db640017f8fda4",
"overUnder": [
{
"betDate": "2019-07-14T11:34:09.472Z",
"competition": {
"country": "jh",
"league": "jhj"
},
"homeTeam": "jh",
"awayTeam": "hj",
"gameStarted": false,
"gameFinished": false,
"homeHalfTimeScore": -1,
"awayHalfTimeScore": -1,
"homeScore": -1,
"awayScore": -1,
"tip": "Over0.5",
"risk": 0,
"tipResult": "pending",
"betCategory": "overUnder",
"tipper": "reptile",
"_id": "5d2b143749db640017f8fda6"
},
{
"betDate": "2019-07-14T13:24:19.804Z",
"competition": {
"country": "kenya",
"league": "add"
},
"homeTeam": "da",
"awayTeam": "ada",
"gameStarted": false,
"gameFinished": false,
"homeHalfTimeScore": -1,
"awayHalfTimeScore": -1,
"homeScore": -1,
"awayScore": -1,
"tip": "1X",
"risk": 0,
"tipResult": "pending",
"betCategory": "overUnder",
"tipper": "reptile",
"_id": "5d2b30043b2bc800172f5f3f"
}
],
"threeWay": [
{
"betDate": "2019-07-14T13:24:19.804Z",
"competition": {
"country": "kenya",
"league": "add"
},
"homeTeam": "da",
"awayTeam": "ada",
"gameStarted": false,
"gameFinished": false,
"homeHalfTimeScore": -1,
"awayHalfTimeScore": -1,
"homeScore": -1,
"awayScore": -1,
"tip": "1X",
"risk": 0,
"tipResult": "pending",
"betCategory": "threeWay",
"tipper": "reptile",
"_id": "5d2b30083b2bc800172f5f40"
}
],
"doubleChance": [
{
"betDate": "2019-07-14T13:24:19.804Z",
"competition": {
"country": "kenya",
"league": "add"
},
"homeTeam": "da",
"awayTeam": "ada",
"gameStarted": false,
"gameFinished": false,
"homeHalfTimeScore": -1,
"awayHalfTimeScore": -1,
"homeScore": -1,
"awayScore": -1,
"tip": "1X",
"risk": 0,
"tipResult": "pending",
"betCategory": "doubleChance",
"tipper": "reptile",
"_id": "5d2b30003b2bc800172f5f3e"
}
],
"goalGoal": [
{
"betDate": "2019-07-14T13:24:19.804Z",
"competition": {
"country": "kenya",
"league": "add"
},
"homeTeam": "da",
"awayTeam": "ada",
"gameStarted": false,
"gameFinished": false,
"homeHalfTimeScore": -1,
"awayHalfTimeScore": -1,
"homeScore": -1,
"awayScore": -1,
"tip": "1X",
"risk": 0,
"tipResult": "pending",
"betCategory": "goalGoal",
"tipper": "reptile",
"_id": "5d2b300c3b2bc800172f5f41"
}
],
"halfTime": [
{
"betDate": "2019-07-14T13:24:19.804Z",
"competition": {
"country": "kenya",
"league": "add"
},
"homeTeam": "da",
"awayTeam": "ada",
"gameStarted": false,
"gameFinished": false,
"homeHalfTimeScore": -1,
"awayHalfTimeScore": -1,
"homeScore": -1,
"awayScore": -1,
"tip": "1X",
"risk": 0,
"tipResult": "pending",
"betCategory": "halfTime",
"tipper": "reptile",
"_id": "5d2b30113b2bc800172f5f42"
}
],
"bookingPts": [
],
"__v": 0
}
]
这是我的 Java 数据模式:
public class gamesmodal {
String couponComment;
overs overUnder;
String threeWay;
String doubleChance;
String goalGoal;
String halfTime;
String bookingPts;
public String getTitle() {
return couponComment;
}
public void setTitle(String couponComment) {
this.couponComment = couponComment;
}
public class overs extends gamesmodal {
String homeTeam;
String awayTeam;
String tip;
public String getHomeTeam() {
return homeTeam;
}
public void setHomeTeam(String homeTeam) {
this.homeTeam = homeTeam;
}
public String getAwayTeam() {
return awayTeam;
}
public void setAwayTeam(String awayTeam) {
this.awayTeam = awayTeam;
}
public String getTip() {
return tip;
}
public void setTip(String tip) {
this.tip = tip;
}
}
public void setOverUnder(overs overUnder) {
this.overUnder = overUnder;
}
}
我的logcat代码如下:
2019-07-14 16:25:28.396 23946-23946/dvlp.lamseybets E/AndroidRuntime: 致命异常: main 进程:dvlp.lamseybets,PID:23946 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 应为 BEGIN_OBJECT 但在第 1 行第 137 列路径 $[0].overUnder 处为 BEGIN_ARRAY 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) 在 com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) 在 com.google.gson.Gson.fromJson(Gson.java:887) 在 com.google.gson.Gson.fromJson(Gson.java:852) 在 com.google.gson.Gson.fromJson(Gson.java:801) 在 dvlp.lamseybets.matchResult$1.onResponse(matchResult.java:90) 在 dvlp.lamseybets.matchResult$1.onResponse(matchResult.java:82) 在 com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:83) 在 com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106) 在 android.os.Handler.handleCallback(Handler.java:836) 在 android.os.Handler.dispatchMessage(Handler.java:103) 在 android.os.Looper.loop(Looper.java:203) 在 android.app.ActivityThread.main(ActivityThread.java:6251) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 原因:java.lang.IllegalStateException:预期 BEGIN_OBJECT 但在第 1 行第 137 列路径 $[0].overUnder 处为 BEGIN_ARRAY 在 com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) 在 com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) 在 com.google.gson.Gson.fromJson(Gson.java:887) 在 com.google.gson.Gson.fromJson(Gson.java:852) 在 com.google.gson.Gson.fromJson(Gson.java:801) 在 dvlp.lamseybets.matchResult$1.onResponse(matchResult.java:90) 在 dvlp.lamseybets.matchResult$1.onResponse(matchResult.java:82) 在 com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:83) 在 com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106) 在 android.os.Handler.handleCallback(Handler.java:836) 在 android.os.Handler.dispatchMessage(Handler.java:103) 在 android.os.Looper.loop(Looper.java:203) 在 android.app.ActivityThread.main(ActivityThread.java:6251) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 2019-07-14 16:25:29.993 23946-23957/dvlp.lamseybets I/art:进入 while 循环。
所以已将数据模式更改为:
import java.util.List;
public class datamodal {
private List<overUnder> overUnder = null;
String couponComment;
private List<threeWay> threeWay = null;
private List<DoubleChance> doubleChance = null;
private List<HalfTime> halfTime = null;
private List<GoalGoal> goalGoal = null;
public String getCouponComment() {
return couponComment;
}
public void setCouponComment(String couponComment) {
this.couponComment = couponComment;
}
public List<overUnder> getOverUnder() {
return overUnder;
}
public void setOverUnder(List<overUnder> overUnder) {
this.overUnder = overUnder;
}
public List<DoubleChance> getDoubleChance() {
return doubleChance;
}
public void setDoubleChance(List<DoubleChance> doubleChance) {
this.doubleChance = doubleChance;
}
public List<HalfTime> getHalfTime() {
return halfTime;
}
public void setHalfTime(List<HalfTime> halfTime) {
this.halfTime = halfTime;
}
public List<GoalGoal> getGoalGoal() {
return goalGoal;
}
public void setGoalGoal(List<GoalGoal> goalGoal) {
this.goalGoal = goalGoal;
}
public List<threeWay> getThreeWay() {
return threeWay;
}
public void setThreeWay(List<threeWay> threeWay) {
this.threeWay = threeWay;
}
}
我需要在此处显示 json 响应
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.VolleyError;
import com.android.volley.Response;
import com.android.volley.toolbox.JsonArrayRequest;
import com.bumptech.glide.Glide;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.json.JSONArray;
import java.util.ArrayList;
import java.util.List;
public class matchResult extends Fragment {
private static final String TAG = matchResult.class.getSimpleName();
private static final String URL = "my url is here";
private RecyclerView recyclerView;
private List<datamodel> movieList;
private StoreAdapter mAdapter;
public matchResult() {
// Required empty public constructor
}
public List<datamodel> datamodel() {
return datamodel();
}
public static matchResult newInstance(String param1, String param2) {
matchResult fragment = new matchResult();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.activity_match_result, container, false);
recyclerView = view.findViewById(R.id.recycler_view);
movieList = new ArrayList<>();
mAdapter = new StoreAdapter(getActivity(), movieList);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
recyclerView.setNestedScrollingEnabled(false);
fetchStoreItems();
return view;
}
private void fetchStoreItems() {
JsonArrayRequest request = new JsonArrayRequest(URL,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
if (response == null) {
Toast.makeText(getActivity(), "Couldn't fetch the store items! Pleas try again.", Toast.LENGTH_LONG).show();
return;
}
List<datamodel> items = new Gson().fromJson(response.toString(), new TypeToken<List<datamodel>>() {
}.getType());
movieList.clear();
movieList.addAll(items);
// refreshing recycler view
mAdapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// error in getting json
Log.e(TAG, "Error: " + error.getMessage());
Toast.makeText(getActivity(), "Error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
MyApplication.getInstance().addToRequestQueue(request);
}
class StoreAdapter extends RecyclerView.Adapter<StoreAdapter.MyViewHolder> {
private Context context;
private List<datamodel> movieList;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView name, price;
public ImageView thumbnail;
public MyViewHolder(View view) {
super(view);
name = view.findViewById(R.id.title);
price = view.findViewById(R.id.price);
thumbnail = view.findViewById(R.id.thumbnail);
}
}
public StoreAdapter(Context context, List<datamodel> movieList) {
this.context = context;
this.movieList = movieList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
final datamodel movie = movieList.get(position);
holder.name.setText((CharSequence) movie.getHomeTeam());
holder.price.setText((CharSequence) movie.getAwayTeam());
}
@Override
public int getItemCount() {
return movieList.size();
}
}
}
【问题讨论】: