JSON解析之手动解析

来源:互联网 发布:inpaint mac破解版 编辑:程序博客网 时间:2024/06/01 11:10
1、JSON简介
1)概念:
JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。
2)特点:
(1)本质就是具有特定格式的字符串
(2)JSON完全独立于编程语言
(3)JSON比XML数据传输的有效性要高出很多。
2、JSON数据格式
1)整体结构
String json1 = "{"id":12,"name":"Tom"}";
String json2 = "[{"id":12,"name":"Tom"},{"id":12,"name":"Tom"}]";
2)Json对象: {}
(1)Json对象的结构: {key1:value1, key2:value2, key3:value3}
(2)key的数据类型: 字符串
(3)value的数据类型: 
数值
字符串
null
json数组 []
json对象 {}
(4)例子
正确的
{“name”:”TOM”, “age”:12}
错误的
{“aa”:“a”, 3}
3)Json数组 :  [ ]
(1)Json数组的结构: [value1, value2, value3]
(2)value的数据类型: 
数值
字符串
null
json数组 []
json对象 {}
(3)例子
正确的:
[1, “ab”,[], {“n”:123, “b”:”abc”}]
错误的:
[1, “a”:3]
3、JSON解析方向

客户端与服务端数据转换.png
1)将java对象(包含集合)转换为json格式字符串
在服务器端应用
2)将json格式字符串转换为java对象(包含集合)
在客户端应用
3)Json和Java之间的转换关系
JSON对应Java对象.png
JSON数组和Java对象构成的list对应.png
4、JSON解析技术
1)Android原生技术:
(1)特点
编程相对麻烦
(2)数据之间转换
(1)将json格式的字符串{}转换为Java对象
API:
JSONObject(String json) : 将json字符串解析为json对象
Xxx getXxx(String name) : 根据name, 在json对象中得到对应的Value
Xxx optXxx(String name) : 根据name, 在json对象中得到对应的Value
注意:
optXxx方法会在对应的key中的值不存在的时候返回一个空字符串或者返回你指定的默认值,但是getString方法会出现空指针异常的错误。
测试数据:
(2)将json格式的字符串[]转换为Java对象的List
API:
JSONArray(String json) : 将json字符串解析为json数组
int length() : 得到json数组中元素的个数
Xxx getXxx(int index) : 根据下标得到json数组中对应的元素数据
Xxx optXxx(int index) : 根据下标得到json数组中对应的元素数据
注意:
optXxx方法会在对应的key中的值不存在的时候返回一个空字符串或者返回你指定的默认值,但是getString方法会出现空指针异常的错误。
测试数据:
(3)复杂json数据解析

a) 测试数据:

http://api.ds.lingshi.cccwei.com/?cid=625561&uid=0&tms=20160427085818&sig=36b291895c63dfc4&wssig=26637611c0c64fb7&os_type=3&version=24&channel_name=feibo&srv=2402&classify_id=32
b) GsonFormat工具生成对象类
见工具使用
c) 手动解析json数据
(4)特殊json数据解析
a) 测试数据
http://api.bilibili.com/online_list?_device=android&platform=android&typeid=13&sign=a520d8d8f7a7240013006e466c8044f7
b) 手动写解析json数据的对象类
c) 手动解析json数据
2)Gson框架技术
(1)特点:
编码简洁,谷歌官方推荐
(2)下载地址
https://mvnrepository.com/artifact/com.google.code.gson/gson
(3)数据之间转换
(1)将json格式的字符串{}转换为Java对象
API:
fromJson(String json, Class<T> classOfT);
注意:
要求json对象中的key的名称与java对象对应的类中的属性名要相同
步骤
1)将Gson的jar包导入到项目中
2)创建Gson对象  :
Gson gson = new Gson();
3)通过创建的Gson对象调用fromJson()方法,返回该JSON数据对应的Java对象:
ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);
测试数据:
(2)将json格式的字符串[]转换为Java对象的List
API:
fromJson(String json, Type typeOfT);
type
测试数据:
步骤
1)将Gson的jar包导入到项目中
2)创建Gson对象  :
Gson gson = new Gson();
3)通过创建的Gson对象调用fromJson()方法,返回该JSON数据对应的Java集合:
List<ShopInfo> shops = gson.fromJson(json, new TypeToken<List<ShopInfo>>() {}.getType());
(3)将Java对象转换为json字符串{}
API:
String toJson(Object src);
步骤
1)将Gson的jar包导入到项目中
2)创建Gson对象  :
Gson gson = new Gson();
3)通过创建的Gson对象调用toJson()方法,返回json数据:
ShopInfo shop = new ShopInfo(1, "鲍鱼", 250.0, "");
String json = gson.toJson(shop);
(4)将Java对象的List转换为json字符串[]
API:
String toJson(Object src);
步骤
1)将Gson的jar包导入到项目中
2)创建Gson对象  :
Gson gson = new Gson();
3)通过创建的Gson对象调用toJson()方法,返回json数据:
List<ShopInfo> shops = new ArrayList<>();
String json = gson.toJson(shops);
3)FastJson框架技术
(1)特点:
Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。
(2)下载地址:
https://github.com/alibaba/fastjson/wiki
(3)数据之间转换
(1)将json格式的字符串{}转换为Java对象
API:
parseObject(String json, Class<T> classOfT);
步骤:
1)导入fastjson的jar包
2)JSON调用parseObject()方法,获取转换后的Java对象
例如:ShopInfo shopInfo = JSON.parseObject(json, ShopInfo.class);
测试数据:
(2)将json格式的字符串[]转换为Java对象的List
API:
List<T> parseArray(String json,Class<T> classOfT);
步骤:
1)导入fastjson的jar包
2)JSON调用parseArray()方法,获取转换后的Java集合
例如:List<ShopInfo> shopInfos = JSON.parseArray(json, ShopInfo.class);
测试数据:
(3)将Java对象转换为json字符串{}
API:
String toJSONString(Object object);
步骤:
1)导入fastjson的jar包
2)JSON调用toJSONString()方法,获取转换后的json数据
例如:
ShopInfo shopInfo = new ShopInfo(1, "鲍鱼", 250.0, "baoyu");
String json = JSON.toJSONString(shopInfo);
(4)将Java对象的List转换为json字符串[]
API:
String toJSONString(Object object);
步骤:
1)导入fastjson的jar包
2)JSON调用toJSONString()方法,获取转换后的json数据
例如:
List<ShopInfo> shops = new ArrayList<>();
ShopInfo baoyu = new ShopInfo(1, "鲍鱼", 250.0, "baoyu");
ShopInfo longxia = new ShopInfo(2, "龙虾", 251.0, "longxia");


shops.add(baoyu);
shops.add(longxia);


String json = JSON.toJSONString(shops);

五、测试数据:

①{
"id":2, "name":"大虾", 
"price":12.3, 
"imagePath":"http://192.168.10.165:8080/L05_Server/images/f1.jpg"
}

②[
    {
        "id": 1,
        "imagePath": "http://192.168.10.165:8080/f1.jpg",
        "name": "大虾1",
        "price": 12.3
    },
    {
        "id": 2,
        "imagePath": "http://192.168.10.165:8080/f2.jpg",
        "name": "大虾2",
        "price": 12.5
    }
]

③{
    "data": {
        "count": 5,
        "items": [
            {
                "id": 45,
                "title": "坚果"
            },
            {
                "id": 132,
                "title": "炒货"
            },
            {
                "id": 166,
                "title": "蜜饯"
            },
            {
                "id": 195,
                "title": "果脯"
            },
            {
                "id": 196,
                "title": "礼盒"
            }
        ]
    },
    "rs_code": "1000",
    "rs_msg": "success"
}

④{
    "code": 0,
    "list": {
        "0": {
            "aid": "6008965",
            "author": "哔哩哔哩番剧",
            "coins": 170,
            "copyright": "Copy",
            "create": "2016-08-25 21:34"
        },
        "1": {
            "aid": "6008938",
            "author": "哔哩哔哩番剧",
            "coins": 404,
            "copyright": "Copy",
            "create": "2016-08-25 21:33"
        }
    }
}
原创粉丝点击