文档章节

Android技能-创建Json文本及Json解析

Ryane
 Ryane
发布于 2016/07/15 11:26
字数 1304
阅读 132
收藏 1

摘要:Json数据在安卓开发过程中是非常常见的,在请求服务器端数据的时候,服务器端返回的无非就是三种类型:HTML,XML,JSON。所以学习JSON对安卓程序员来说是非常重要的。

什么是JSON

JSON:JavaScript Object Notation。顾名思义,JSON数据是源自于JavaScript,学习过JavaScript(以下简称JS)的人都知道,我们在JS脚本里面创建对象时,都是以键值对的形式编写的。例如,我们在JS里面创建一个Json对象时是这么定义的:

 var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};

很容易看出,属性之间是通过逗号分隔开,键与值之间是通过双引号分隔开,而JSON数据也是如此。

 

JSON的数据类型

json一共有两种数据结构。

JsonObject

一种是以 (key/value)对形式存在的无序的jsonObject对象。对象使用大括号括起来,属性之间使用逗号分隔开。

例如:{"name": "jack"}, 这就是一个最简单的json对象,对于这种数据格式,key值必须要是string类型,而对于value,则可以是string、number、object、array等数据类型。

 

JsonArray

另一种数据格式就是有序的value的集合,这种形式被称为是JsonArray。数组是值的有序集合,值与值之间使用逗号分隔开,集合用中括号括起来。

 

创建JSON文本

例如我们要创建以下类型的Jjson数据:

{"person":{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}}

使用JSONOject和JSONArray创建

  /**
    * 使用JsonObject和JsonArray创建JSON对象
    */
    public void makeJson() {
        try {
            JSONObject object = new JSONObject();

            JSONObject person = new JSONObject();
            //名字
            person.put("name", "zhangsan");
            //电话
            JSONArray phone = new JSONArray();
            phone.put("123").put("456");
            person.put("phone", phone);
            //地址
            person.put("address", "guangdong");

            object.put("person", person);

            Log.i("JSON_LOG", object.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

输出结果

使用JsonStringer创建

   /**
     * 通过JsonStringer创建JSON对象
     */
    public void makeJsonStringer() {
        try {
            JSONStringer jsonText = new JSONStringer();
            // 首先是{,对象开始。object和endObject必须配对使用
            jsonText.object();

            jsonText.key("person");

            jsonText.object();

            jsonText.key("name");
            jsonText.value("zhangsan");

            jsonText.key("phone");
            // 键phone的值是数组。array和endArray必须配对使用
            jsonText.array();
            jsonText.value("123").value("456");
            jsonText.endArray();

            jsonText.key("address");
            jsonText.value("Guangdong");

            jsonText.endObject();

            jsonText.endObject();


            Log.i("JSON_LOG", jsonText.toString());
        } catch (JSONException ex) {
            throw new RuntimeException(ex);
        }
    }

输出结果:

JSON解析

1. 解析{"key", "Object"}类型的

{"person":{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}}

解析代码


    /**
     * JSON解析
     * @param json
     * @return
     */
    public static String JsonToString(String json) {
        Person person = new Person();
        try {
            //获取到整个Json数据
            JSONObject object = new JSONObject(json);
            //解析最外层,获得person键对应的object值
            JSONObject personObject = object.getJSONObject("person");
            //解析object值里面的每一个属性
            person.setName(personObject.getString("name"));
            //属性值是数组,则使用JSONArray获取
            JSONArray phoneArray = personObject.getJSONArray("phone");
            List<String> phone = new ArrayList<>();
            for (int i = 0; i < phoneArray.length(); i++) {
                phone.add((String) phoneArray.get(i));
            }
            person.setPhone(phone);
            person.setAddress(personObject.getString("address"));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return person.toString();
    }

结果

 

2. 解析{"Object"}类型

{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}

这么解析:

 	/**
     * 解析单个对象的JSON数据
     * @param json
     * @return
     */
    public static String JsonParse(String json) {
        Person person = new Person();
        try {
            JSONObject personObject = new JSONObject(json);
            //解析object值里面的每一个属性
            person.setName(personObject.getString("name"));
            //属性值是数组,则使用JSONArray获取
            JSONArray phoneArray = personObject.getJSONArray("phone");
            List<String> phone = new ArrayList<>();
            for (int i = 0; i < phoneArray.length(); i++) {
                phone.add((String) phoneArray.get(i));
            }
            person.setPhone(phone);
            person.setAddress(personObject.getString("address"));
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return person.toString();
    }

3. 解析{"value"}类型

["123", "456", "789"];

解析方法:

    /**
     * 解析数组型的JSON数据
     * @param json
     * @return
     */
    public static List<String> JsonParseToArray(String json){
        List<String> list = new ArrayList<>();
        try {
            JSONArray array = new JSONArray(json);
            for (int i=0; i<array.length(); i++){
                list.add((String) array.get(i));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return list;
    }

解析总结 
JSON解析无非就是通过JSONObject和JSONArray不断地对数据进行解析,归根结底每一种数据都是可以分解为以上的三种最基本的解析,所以大家只要掌握好JSONObject和JSONArray,即便再复杂的数据类型,大家也可以解析得得心应手。

 

GSON

GSON是Google开发的开源的JAVA API,可以用于JSON的创建和JSON的解析。下面对GSON做一个最基本的介绍。更多了解http://sites.google.com/site/gson/

首先需要下载GSON的jar包,自行度娘。

其次,我们使用GSON来创建JSON和解析JSON都要有相对应的JavaBean,所以GSON可以帮助我们更加简便地实现Bean和JSON的转换。

以下例子我们都是用Person类的JavaBean:

    public class Person {
	    private String name;
	    private List<String> phone;
	    private String address;
	
	    public Person() {
	
	    }
	
	    public Person(String name, List<String> phone, String address) {
	        this.name = name;
	        this.phone = phone;
	        this.address = address;
	    }
	
	    public String getName() {
	        return name;
	    }
	
	    public void setName(String name) {
	        this.name = name;
	    }
	
	    public List<String> getPhone() {
	        return phone;
	    }
	
	    public void setPhone(List<String> phone) {
	        this.phone = phone;
	    }
	
	    public String getAddress() {
	        return address;
	    }
	
	    public void setAddress(String address) {
	        this.address = address;
	    }
	
	    @Override
	    public String toString() {
	        return "Person{" +
	                "name='" + name + '\'' +
	                ", phone=" + phone +
	                ", address='" + address + '\'' +
	                '}';
	    }
	}

Bean转换为JSON

    /**
     * GSON转换为JSON
     *
     * @return json
     */
    public String beanToJson() {

        //赋值给一个person实例
        List<String> phone = new ArrayList<>();
        phone.add("123");
        phone.add("456");
        Person person = new Person("jack", phone, "Guangzhou");

        //实例化GSON
        Gson gson = new Gson();
        //调用gson.toJson将Bean转为JSON
        String json = gson.toJson(person);
        return json;
    }

JSON转换为Bean

    /**
     * JSON转换为Bean
     * @param json
     * @return
     */
    public String jsonToBean(String json) {
        Person person = new Person();
        Gson gson = new Gson();
        //调用gson.fromJson将json转为bean
        person = gson.fromJson(json, Person.class);
        return person.toString();
    }

 

© 著作权归作者所有

Ryane
粉丝 42
博文 22
码字总数 55318
作品 0
程序员
私信 提问
在 Android 应用程序中使用 Internet 数据(XML,JSON,Protocol Bu

Android 应用程序必须访问位于 Internet 上的数据,而 Internet 数据可以有几种不同的格式。本文将介绍在 Android 应用程序中如何使用三种数据格式: XML JSON Google 的 protocol buffers 首...

红薯
2010/08/08
4K
4
一起学Android之Xml与Json解析

概述 在网络中,数据交互通常是以XML和Json的格式进行,所以对这两种格式的数据进行解析,是Android开发中的必备功能,本文以一个简单的小例子,简述Android开发中Xml和Json解析的常用方式,...

Alan.hsiang
08/03
0
0
android 中JSON的理解与解析

JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不...

Thanks
2013/02/19
578
3
Android四款系统架构工具

Spring for Android   Spring for Android是Spring框架在Android平台上的扩展,旨在简化Android原生应用的开发流程,提高开发者的工作效率。Spring for Android可以帮助开发者简化应用与服...

zhwj407906450
2014/10/21
243
0
Android之JSON格式数据解析

JSON:JavaScript 对象表示法(JavaScript Object Notation)。独立于语言和平台,比 XML 更小、更快,更易解析。如今JSON数据已经成为了互联网中大多数数据的传递方式,所以必须要熟练掌握。...

熊babi
2016/08/24
677
1

没有更多内容

加载失败,请刷新页面

加载更多

利用CSS禁止手机长按出现气泡: 复制、选择等功能

可以用 * ,也可作用于一个div div{  -webkit-touch-callout:none;  /*系统默认菜单被禁用*/  -webkit-user-select:none; /*webkit浏览器*/  -khtml-user-select:none; /*早期浏览...

蓝小驴
53分钟前
9
0
前端的一些雕虫小技,从100%和滚动条说起

1、100%和滚动条 当我们在css中把html和body同时设为100%时,会出现滚动条 html, body { width: 100%; height: 100%; } 原因是html和b...

wphmoon
今天
8
0
电力区块链应用案例【2019】

随着区块链技术的日益普及,出现了大量创业企业尝试使用区块链技术来解决能源与电力行业中存在的问题。在本文中,我们将介绍其中的三个能源区块链项目。 能源行业以价格不透明著称:消费者很...

汇智网教程
今天
12
0
聊聊rocketmq的adjustThreadPoolNumsThreshold

序 本文主要研究一下rocketmq的adjustThreadPoolNumsThreshold DefaultMQPushConsumer rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.ja......

go4it
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部