Android学习之JSON解析(二)使用GSON技术解析JSON

前言

本人学生一枚,现阶段也是进行Android学习,若文章中有什么错误,请大l佬指出。

每篇格言:

我可以一落千丈,我偏要一鸣惊人。
复制代码

用GSON框架技术解析JSON

GSON框架的官网:https://mvnrepository.com/artifact/com.google.code.gson/gson

  • 如果使用Eclipse可发

      选择相应版本的jar包进行下载
    复制代码
  • 如果使用Android Studio开发

      通过Gradle,直接添加以来,不用下载jar包
    复制代码


Gson解析JSON对象(介绍都在代码注释中)

重要的事说一遍:注意在使用Gson解析JSON对象时,记得创建JavaBean类,并且JavaBean类中的属性名要和JSON的key的名称相同,否则解析就会失败

JSON数据
{
	"num": 1,
	"age": 20,
	"data": {
		"chinese": 100,
		"english": 90
	}
}
复制代码
移动端
  • 结构:

重要的事说两遍:注意在使用Gson解析JSON对象时,记得创建JavaBean类,并且JavaBean类中的属性名要和JSON的key的名称相同,否则解析就会失败

  • Data
public class Data {

    private int chinese;
    private int english;

    public int getChinese() {
        return chinese;
    }

    public void setChinese(int chinese) {
        this.chinese = chinese;
    }

    public int getEnglish() {
        return english;
    }

    public void setEnglish(int english) {
        this.english = english;
    }

    @Override
    public String toString() {
        return "Data{" +
                "chinese=" + chinese +
                ", english=" + english +
                '}';
    }
}
复制代码

重要的事说三遍:注意在使用Gson解析JSON对象时,记得创建JavaBean类,并且JavaBean类中的属性名要和JSON的key的名称相同,否则解析就会失败

  • Student
public class Student {

    private int num;
    private int age;
    private Data data;


    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Student{" +
                "num=" + num +
                ", age=" + age +
                ", data=" + data +
                '}';
    }
}
复制代码
  • NetWorkUtils
public class NetWorkUtils {

    private static HttpURLConnection sHttpURLConnection;
    private static BufferedReader sBufferedReader;
    private static InputStream sInputStream;

    /**
     * 通过URL获取String
     *
     * @param urlStr     需要传入的URL
     * @param requestWay 需要传入的请求方式(GET/POST)
     * @return 返货获取的json字符串
     */
    public static String sendUrlGetString(String urlStr, String requestWay) {

        String jsonStr = null;

        try {
            // 创建URL对象
            URL url = new URL(urlStr);
            // 创建HttpURLConnection对象
            sHttpURLConnection = (HttpURLConnection) url.openConnection();
            // 设置网络的请求方式
            sHttpURLConnection.setRequestMethod(requestWay);
            // 设置链接主机超时
            sHttpURLConnection.setConnectTimeout(8000);
            // 设置从主机读取数据超时
            sHttpURLConnection.setReadTimeout(8000);
            // 获取输入流
            sInputStream = sHttpURLConnection.getInputStream();
            // 对获取到的输入流进行读取
            sBufferedReader = new BufferedReader(new InputStreamReader(sInputStream));
            StringBuffer stringBuffer = new StringBuffer();
            String line = "";
            while ((line = sBufferedReader.readLine()) != null) {
                stringBuffer.append(line);
            }
            jsonStr = stringBuffer.toString();
            return jsonStr;

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (sBufferedReader != null) {
                try {
                    sBufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            if (sHttpURLConnection != null) {
                sHttpURLConnection.disconnect();

            }
        }
        return jsonStr;
    }

}
复制代码
  • MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView mJsonTxt;

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


        initViews();

    }

    private void initViews() {

        Button gsonBtn = findViewById(R.id.gson_btn);
        gsonBtn.setOnClickListener(this);

        mJsonTxt = findViewById(R.id.json_txt);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.gson_btn:

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        paraseJSONWithGSON(NetWorkUtils.sendUrlGetString("http://xxx:8080/JsonThree", "GET"));
                    }
                }).start();


                break;
        }
    }

    private void paraseJSONWithGSON(final String str) {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                // 创建一个Gson对象
                Gson gson = new Gson();
                // 调用Gson对象的fromJson(String str,Class<T> class)
                // 第一个参数 : 通过网络请求获取的JSON字符串
                // 第二个参数 : 传入一个JavaBean对象
                Student student = gson.fromJson(str, Student.class);

                mJsonTxt.setText(student.toString());

            }
        });

    }

}

复制代码

Gson解析JSON数组(介绍都在代码注释中)

JSON数据
[
    {
        "id": 1,
        "name": "Amy",
        "age": 20
    },
    {
        "id": 2,
        "name": "Tom",
        "age": 10
    }
]
复制代码
移动端
  • People
public class People {

    private int id;
    private String name;
    private int age;

    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;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "People{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
复制代码
  • MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView mJsonTxt;

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


        initViews();

    }

    private void initViews() {
        Button gsonArrayBtn = findViewById(R.id.gsonArray_btn);
        gsonArrayBtn.setOnClickListener(this);

        mJsonTxt = findViewById(R.id.json_txt);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.gsonArray_btn:
                new Thread(new Runnable() {
                    @Override
                    public void run() {

                        paraseJSONWithGSONArray(NetWorkUtils.sendUrlGetString("http://XXX:8080/JsonTwo", "GET"));
                    }
                }).start();

                break;
        }
    }

    private void paraseJSONWithGSONArray(final String s) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                // 创建Gson对象
                Gson gson = new Gson();
                // 如果解析一段JSON数组会稍微麻烦点。我们需要借助TypeToken将期望解析成的数据类型传入到fromJson方法中。
                List<People> peopleList = gson.fromJson(s, new TypeToken<List<People>>() {
                }.getType());
                for (People people : peopleList) {
                    mJsonTxt.setText("id = " + people.getId() + "\n" + "name = " + people.getName() + "\n" + "age = " + people.getAge());
                }

            }
        });
    }
}

复制代码

总结

当然本篇文章中都是一些简单的JSON数据格式,适合入门学习,当然在实际开发中会很复杂的JSON数据格式,到时候大家见招拆招,不要死记解析步骤。
复制代码

转载于:https://juejin.im/post/5aa3c62ff265da23994e23ac

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值