我的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 / Android运行时:致命异常:主要 程序: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();
}
}
}
答案 0 :(得分:0)
logcat错误明确指出Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 137 path $[0].overUnder
所以试试这个
在游戏模式下
private List<OverUnder> overUnder = null;
public List<OverUnder> getOverUnder() {
return overUnder;
}
public void setOverUnder(List<OverUnder> overUnder) {
this.overUnder = overUnder;
}
和OverUnder下课
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class OverUnder {
@SerializedName("betDate")
@Expose
private String betDate;
@SerializedName("competition")
@Expose
private Competition competition;
@SerializedName("homeTeam")
@Expose
private String homeTeam;
@SerializedName("awayTeam")
@Expose
private String awayTeam;
@SerializedName("gameStarted")
@Expose
private Boolean gameStarted;
@SerializedName("gameFinished")
@Expose
private Boolean gameFinished;
@SerializedName("homeHalfTimeScore")
@Expose
private Integer homeHalfTimeScore;
@SerializedName("awayHalfTimeScore")
@Expose
private Integer awayHalfTimeScore;
@SerializedName("homeScore")
@Expose
private Integer homeScore;
@SerializedName("awayScore")
@Expose
private Integer awayScore;
@SerializedName("tip")
@Expose
private String tip;
@SerializedName("risk")
@Expose
private Integer risk;
@SerializedName("tipResult")
@Expose
private String tipResult;
@SerializedName("betCategory")
@Expose
private String betCategory;
@SerializedName("tipper")
@Expose
private String tipper;
@SerializedName("_id")
@Expose
private String id;
public String getBetDate() {
return betDate;
}
public void setBetDate(String betDate) {
this.betDate = betDate;
}
public Competition getCompetition() {
return competition;
}
public void setCompetition(Competition competition) {
this.competition = competition;
}
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 Boolean getGameStarted() {
return gameStarted;
}
public void setGameStarted(Boolean gameStarted) {
this.gameStarted = gameStarted;
}
public Boolean getGameFinished() {
return gameFinished;
}
public void setGameFinished(Boolean gameFinished) {
this.gameFinished = gameFinished;
}
public Integer getHomeHalfTimeScore() {
return homeHalfTimeScore;
}
public void setHomeHalfTimeScore(Integer homeHalfTimeScore) {
this.homeHalfTimeScore = homeHalfTimeScore;
}
public Integer getAwayHalfTimeScore() {
return awayHalfTimeScore;
}
public void setAwayHalfTimeScore(Integer awayHalfTimeScore) {
this.awayHalfTimeScore = awayHalfTimeScore;
}
public Integer getHomeScore() {
return homeScore;
}
public void setHomeScore(Integer homeScore) {
this.homeScore = homeScore;
}
public Integer getAwayScore() {
return awayScore;
}
public void setAwayScore(Integer awayScore) {
this.awayScore = awayScore;
}
public String getTip() {
return tip;
}
public void setTip(String tip) {
this.tip = tip;
}
public Integer getRisk() {
return risk;
}
public void setRisk(Integer risk) {
this.risk = risk;
}
public String getTipResult() {
return tipResult;
}
public void setTipResult(String tipResult) {
this.tipResult = tipResult;
}
public String getBetCategory() {
return betCategory;
}
public void setBetCategory(String betCategory) {
this.betCategory = betCategory;
}
public String getTipper() {
return tipper;
}
public void setTipper(String tipper) {
this.tipper = tipper;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
提示: 如果我们手动进行JSON解析,则该过程将很麻烦且容易出错。您可以使用jsonschema2pojo 在几秒钟内为您解析JSON。
谢谢。
答案 1 :(得分:0)
您需要一些String对象:
private static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null)
return;
int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.UNSPECIFIED);
int totalHeight = 0;
View view = null;
for (int i = 0; i < listAdapter.getCount(); i++) {
view = listAdapter.getView(i, view, listView);
if (i == 0)
view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, ViewGroup.LayoutParams.WRAP_CONTENT));
view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
但是您的JSON表示它们都是数组。