JSON解析之手动解析

news/2024/7/3 11:25:02
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"
        }
    }
}

http://www.niftyadmin.cn/n/3649321.html

相关文章

leaflet弹窗_使用Leaflet在Angular中构建地图,第3部分:弹出服务

leaflet弹窗In my last post, we expanded upon our Angular Leaflet project by creating a service to serve up Markers. We’re going to now do the same thing for popups. 在上一篇文章中 &#xff0c;我们通过创建服务标记的服务扩展了Angular Leaflet项目。 现在&…

H5前端基础——HTML

网页的结构 一个网页有三个部分组成 结构 结构是页面的整体结构&#xff0c;哪里是标题&#xff0c;哪里是段落&#xff0c;哪里是图片 结构使用HTML来编写 表现 表现是页面的外在的样式&#xff0c;比如字体&#xff0c;字体大小&#xff0c;字体颜色&#xff0c;背景。。。 使…

[收藏]如何用这篇文章解决我们的工程对普通COM组件的引用:《引用ActiveX/COM组件时的Strong Name》

CSharp Tips&#xff1a;引用ActiveX/COM组件时的Strong Name 选择自 Mittermeyer 的 Blog 问题DotNet平台下提供了比较完备的类库&#xff0c;但是第一个版本总归不可能面面俱到&#xff0c;而且由于历史遗留问题&#xff0c;经常会和COM/ActiveX的组件之间进行互操作。笔…

使用Simple React Snippets VSCode扩展更快地编写React

I’m a big fan of speeding up every part of your development. If you shave off seconds here and there multiple times a day, you’ll save a ton of time over the course of a year. 我非常乐于加速开发的每个部分。 如果您每天在这里和那里多次剃光&#xff0c;那么一…

H5前端基础——css

CSS叫做层叠样式表&#xff0c;用来设置页面中元素的样式。背景颜色、字体颜色、字体大小。。。 CSS负责结构、表现、行为中的表现 编写的位置 1.内联样式 将样式编写到标签的style属性中 <p style"color:red;"></p> 这种样式只会对当前标签起作用&#…

[dotNET]用HttpWebRequest加载证书建立SSL通道时发生异常的解决办法

用HttpWebRequest加载证书建立SSL通道时发生异常的解决办法UltraPower关键字&#xff1a;HttpWebRequest,SSL,X509CertificatedotNet Framwork 1.1编写时间&#xff1a;2005-3-29WSE 2.0 SP3目的&#xff1a;对于用HttpWebRequest加载证书请求远端https服务器时&#xff0c;发…

prisma orm_Prisma中的身份验证-第3部分:验证

prisma ormIn Part 2 of this series we covered how to generate a temporary token for our user whenever they login or create an account. Now we’re going to wrap it up by restricting our data to only certain authorized users. 在本系列的第2部分中&#xff0c;我…

H5前端基础——盒子模型

CSS中将每一个元素都设置为了一个矩形的盒子 将所有的元素都设置为盒子&#xff0c;是为了方便页面的布局 当这些元素都是盒子以后&#xff0c;我们的布局就变成了在页面中摆放盒子 盒子模型 每个盒子都由如下几部分构成 内容区 内容区相当于盒子存放东西的空间 内容区在盒子的…