在Java数据模式中映射嵌套的json

时间:2019-07-14 13:49:11

标签: java android arrays json

  

我的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();
        }
    }
}

2 个答案:

答案 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表示它们都是数组。