【问题标题】:How to parse this Betting API?如何解析这个投注 API?
【发布时间】:2018-02-09 16:18:10
【问题描述】:

我在 Android 中获取 Jason 响应方面的经验并不丰富。我的问题是如何解析来自这个 API https://api.the-odds-api.com/v2/odds/?sport=UPCOMING&region=uk&apiKey=e3b70c1881a5d9eec34e4cb256844874 的 JSON。基本上为了介绍,我需要活动的参与者。然后我想创建一个匹配列表并从中创建RecyclerView

这是我与 API 通信的类

private class JsonTask extends AsyncTask<String, String, String> implements OnVisibleCallback{


    protected String doInBackground(String... params) {


        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();


            InputStream stream = connection.getInputStream();

            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer buffer = new StringBuffer();
            String line = "";

            while ((line = reader.readLine()) != null) {
                buffer.append(line+"\n");
                Log.d("Response: ", "> " + line);   //here u ll get whole response...... :-)

            }

            return buffer.toString();


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(String response) {
        super.onPostExecute(response);
        Log.d("json",response);
        try {
            JSONObject jObject = new JSONObject(response);
            String data = jObject.getString("data");
            JSONObject objData = new JSONObject(data);
            String events = objData.getString("events");
            JSONObject eventObj = new JSONObject(events);
            int numberOfEvents = eventObj.length();





            List<Match> matchList= Arrays.asList(new Match("Juventus","Fiorentina"));


            counter = 1;
            Log.d("Counter_Ticket_Fragment", String.valueOf(counter));

            mAdapter = new MatchAdapter(matchList,counter);
            changeVisible();
            mAdapter.setCallback(this);
            recyclerView.setAdapter(mAdapter);
            recyclerView.setItemAnimator(new DefaultItemAnimator());

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void changeVisible() {
        if(mAdapter.getItemCount()>0){
            noMatch.setVisibility(View.GONE);
        }
        else{
            noMatch.setVisibility(View.VISIBLE);
        }
    }
}

不知何故,我参加了活动,但不知道如何进行。我需要一些事件,因为我想创建尽可能多的 Match.class(String homeTeam, String awayTeam) 对象并将其传递给回收视图。我正在这个 JsonTask 上执行此操作,我认为这确实不是最好的方法。JsonTask 被称为 OnCreateViewFragment

这是 Match.class

   public class Match  {

private String team_home;
private String team_away;



        public Match(String team_home, String team_away){
            this.team_home = team_home;
            this.team_away = team_away;
        }

public String getHomeTeam() {
    return team_home;
}

public String getAwayTeam() {
    return team_away;
}
}

这是 MatchAdapter

   public class MatchAdapter extends RecyclerView.Adapter<MatchAdapter.MyViewHolder> {
private List<Match> matchList;
private Context context;
private int counter;
private static SharedPreferences prefs;
private OnVisibleCallback callback;


public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView team_home, team_away;
    public View v;


    public MyViewHolder(View v) {
        super(v);
        this.v = v;
        team_home = (TextView) v.findViewById(R.id.team_home);
        team_away = (TextView) v.findViewById(R.id.team_away);
        context = v.getContext();

    }
}


public MatchAdapter(List<Match>  matchList, int counter) {
    this.matchList = matchList;
    this.counter = counter;
}

public void setCallback(OnVisibleCallback callback) {
    this.callback = callback;
}

@Override
public MatchAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.recycler_view_matches_row, parent, false);
    return new MyViewHolder(itemView);
}


@Override
public void onBindViewHolder(final MatchAdapter.MyViewHolder holder, final int position) {
    final Match match = matchList.get(position);
    holder.team_home.setText(match.getHomeTeam());
    holder.team_away.setText(match.getAwayTeam());



}

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

}

【问题讨论】:

  • 为 json 创建 POJO 类并使用改造 2 进行 API 调用

标签: android json android-recyclerview


【解决方案1】:

我建议你改变你的后端 json 数据,因为数据结构不好。

创建一个事件数组,其中数组的每个元素都是一个对象,然后使用下面的代码解析您的数据

       JSONObject jObject = new JSONObject(response);
        String data = jObject.getString("data");
        JSONObject objData = new JSONObject(data);
        String events = objData.getString("events");
       JSONArray jsonEvent = 
                            objData.getJsonArray(events);
       for(int i=0; i<jsonEvent.length; I++){
             JsonObject jsonObj = jsonEvent.getJsonObject(i);
       }

【讨论】:

  • 我不做后端,这个json是被投注API使用的。我同意应该更改 json 结构。我会将偶数作为数组。上面的代码对我不起作用,因为事件是字符串,它无法解析方法 getJsonArray(java.lang.String)
  • 联系此 api 提供者的开发人员支持,以遵循 beck-end 的正确结构
【解决方案2】:
JSONObject jObject = new JSONObject(response);
            String data = jObject.getString("data");
            JSONObject objData = new JSONObject(data);
            String events = objData.getString("events");
            JSONObject eventObj = new JSONObject(events);
            int numberOfEvents = eventObj.length();


            for(int i = 0; i<numberOfEvents; i++){
                event = eventObj.names().getString(i);
                String matchOne = eventObj.getString(event);
                JSONObject singleEventObj = new JSONObject(matchOne);
                JSONArray participants = singleEventObj.getJSONArray("participants");
                }

我确实迭代了事件名称(键),现在一切正常

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2020-06-20
    相关资源
    最近更新 更多