【问题标题】:mapping nested json in java data modal在 java 数据模式中映射嵌套的 json
【发布时间】: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();
        }
    }
}

【问题讨论】:

    标签: java android arrays json


    【解决方案1】:

    正如 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。

    谢谢。

    【讨论】:

    • @SAMNJORmtv 嘿,只需转到该站点并将您的 JSON 粘贴到那里。它将为您生成所有模型类。如果我在这里发布所有模型文件,那将是不明智的。
    【解决方案2】:

    您需要一些 String 对象:

        String threeWay;
        String doubleChance;
        String goalGoal;
        String halfTime;
        String bookingPts
    

    但是你的 JSON 说它们都是数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 2012-09-24
      相关资源
      最近更新 更多