移动应用开发实践-Task3-Gson的简单应用

- 目标

在Task2的基础上,分别使用以下三个方法,将json对象配置为自定义java类。

  • json的单个获取
  • gson的单个获取
  • gson的列表获取

Task2链接:https://editor.csdn.net/md/?articleId=114660183

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。

1. 配置gson(和之前配置OkHttp一样)

gson

2.做一个带ListView的获取页面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="请在下方输入URL" />

    <EditText
        android:id="@+id/et_url"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:text="http://guolin.tech/api/china" />

    <Button
        android:id="@+id/bt_json_array"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="By Json" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/bt_v1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Gson V1" />

        <Button
            android:id="@+id/bt_v2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Gson V2" />
    </LinearLayout>

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/tv_ack"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

在这里插入图片描述

3.简单创建一个City对象

在这里插入图片描述

package com.example.fyn_weather_task3_0.data;

public class City {
    private int id;
    private String name;

    public City(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return String.format("%s-id=%d",name,id);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

alt + insert 可以直接唤出基本类方法的快速添加,自定义类时可以节约时间
在这里插入图片描述

4.将json对象转为自定义对象的三个方法

  • json的单个获取(常用方法)
private ArrayList<City> parseJsonCityByArray(String s) {
        // 创建存放City的列表
        ArrayList<City> cityList = new ArrayList<>();
        try {
            //创建json列表,传参s就是我们的网页数据
            JSONArray jsonArray = new JSONArray(s);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                //获取json列表每个对象的id和name
                int id = jsonObject.getInt("id");
                String name = jsonObject.getString("name");
                //通过构造函数创建city对象放入列表
                City city = new City(id, name);
                cityList.add(city);

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return cityList;
    }
  • gson的单个获取(gson单个json目标转换的简单应用)
private ArrayList<City> parseGsonCityByArrayV1(String s) {
        // 创建存放City的列表
        ArrayList<City> cityList = new ArrayList<>();
        try {
            //创建json列表,传参s就是我们的网页数据
            JSONArray jsonArray = new JSONArray(s);
            for (int i = 0; i < jsonArray.length(); i++) {
                //将jsonArray中的object转为String类型
                String s1 = jsonArray.get(i).toString();
                // gson直接将string对象转为city类型
                // Gson().fromJson(被转换对象,转换对象类型)
                City city = new Gson().fromJson(s1, City.class);
                cityList.add(city);

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return cityList;
    }
  • gson的列表获取 (主要要学的,整体转换)
private ArrayList<City> parseGsonCityByArrayV2(String s) {
        ArrayList<City> cityList = new ArrayList<>();
        if (!TextUtils.isEmpty(s)) {
            try {
                // 新建一个Type类型 List<City> 为type (存放City的列表这个类型)
                Type type = new TypeToken<List<City>>() {
                }.getType();
                //直接转换
                cityList = new Gson().fromJson(s, type);
            } catch (JsonSyntaxException e) {
                e.printStackTrace();
            }
        }
        return cityList;
    }

下面是MainActivity的完整代码

package com.example.fyn_weather_task3_0;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import com.example.fyn_weather_task3_0.data.City;
import com.example.fyn_weather_task3_0.utility.HttpUtil;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    EditText editText;
    ArrayAdapter<City> adapter;
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_main);

        editText = findViewById(R.id.et_url);
        listView = findViewById(R.id.listView);

        Button button = findViewById(R.id.bt_json_array);
        Button button1 = findViewById(R.id.bt_v1);
        Button button2 = findViewById(R.id.bt_v2);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String url = editText.getText().toString().trim();
                HttpUtil.getOkHttpAsync(MainActivity.this, url, new HttpUtil.SimpleAsyncCall() {
                    @Override
                    public void onFailure(String e) {

                    }

                    @Override
                    public void onResponse(String s) {
                        ArrayList<City> list = parseJsonCityByArray(s);
                        updateListView(list);
                    }
                });
            }
        });
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String url = editText.getText().toString().trim();
                HttpUtil.getOkHttpAsync(MainActivity.this, url, new HttpUtil.SimpleAsyncCall() {
                    @Override
                    public void onFailure(String e) {

                    }

                    @Override
                    public void onResponse(String s) {
                        ArrayList<City> list = parseGsonCityByArrayV1(s);
                        updateListView(list);
                    }
                });
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String url = editText.getText().toString().trim();
                HttpUtil.getOkHttpAsync(MainActivity.this, url, new HttpUtil.SimpleAsyncCall() {
                    @Override
                    public void onFailure(String e) {

                    }

                    @Override
                    public void onResponse(String s) {
                        ArrayList<City> list = parseGsonCityByArrayV2(s);
                        updateListView(list);
                    }
                });
            }
        });
    }

    //更新ListView内容
    private void updateListView(ArrayList<City> list) {
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1, list);
        listView.setAdapter(adapter);
    }

    private ArrayList<City> parseJsonCityByArray(String s) {
        // 创建存放City的列表
        ArrayList<City> cityList = new ArrayList<>();
        try {
            //创建json列表,传参s就是我们的网页数据
            JSONArray jsonArray = new JSONArray(s);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                //获取json列表每个对象的id和name
                int id = jsonObject.getInt("id");
                String name = jsonObject.getString("name");
                //通过构造函数创建city对象放入列表
                City city = new City(id, name);
                cityList.add(city);

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

    private ArrayList<City> parseGsonCityByArrayV1(String s) {
        // 创建存放City的列表
        ArrayList<City> cityList = new ArrayList<>();
        try {
            //创建json列表,传参s就是我们的网页数据
            JSONArray jsonArray = new JSONArray(s);
            for (int i = 0; i < jsonArray.length(); i++) {
                //将jsonArray中的object转为String类型
                String s1 = jsonArray.get(i).toString();
                // gson直接将string对象转为city类型
                // Gson().fromJson(被转换对象,转换对象类型)
                City city = new Gson().fromJson(s1, City.class);
                cityList.add(city);

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

    private ArrayList<City> parseGsonCityByArrayV2(String s) {
        ArrayList<City> cityList = new ArrayList<>();
        if (!TextUtils.isEmpty(s)) {
            try {
                // 新建一个Type类型 List<City> 为type (存放City的列表这个类型)
                Type type = new TypeToken<List<City>>() {
                }.getType();
                //直接转换
                cityList = new Gson().fromJson(s, type);
            } catch (JsonSyntaxException e) {
                e.printStackTrace();
            }
        }

        return cityList;
    }

}

5.运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值