JSON解析学习笔记(json、gson、fastjson)
来源:互联网 发布:c语言数组视频 编辑:程序博客网 时间:2024/05/02 01:11
JSON解析学习笔记
JSON(JavaScript Object Notation Javascript):表示对象的一种方式,是基于JavaScript语言的轻量级数据交换格式(即:用来传输数据的一种格式)。
首先,我们先来比较下JSON和XML的区别:
JSON数据量小,可读性差,功能单一,只能用于保存数据。
XML数据量大,可读性好,可以用于软件配置和布局绘图、保存数据等。
可以通过使用bejson - 在线JSON校验格式化工具(Be JSON)快速将XML转为JSON格式。
JSON的表示结构:
JSON就是一串字符串 只不过元素会使用特定的符号标注。
{} 双括号表示对象
[] 中括号表示数组
“” 双引号或’’单引号内是属性或值
: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
所以 {“name”: “zhangsan”} 可以理解为是一个包含name为zhangsan的对象,而[{“name”: “zhangsan”},{“name”: “lisi”}]就表示包含两个对象的数组 。
下面是一些示例:
1、表示对象:{brand:’宝马’,color:’red’,price:150}
2、表示数组:[{brand:’宝马’,color:’red’,price:150},{brand:’宝马’,color:’red’,price:150}, {brand:’宝马’,color:’red’,price:150},{brand:’宝马’,color:’red’,price:150}]
3、表示复杂的对象:{brand:’宝马’,color:’red’,price:150,engine:{company:’无名’,horsePower:‘400’}}
4、表示含有数组或者集合的对象:{address:’**’,time’2016-1-1’,cars:[{brand:’宝马’,color:’red’,price:150},{brand:’宝马’,color:’red’,price:150}, {brand:’宝马’,color:’red’,price:150},{brand:’宝马’,color:’red’,price:150}]}
JSON解析(Android自带的解析方式)
1.当JSON字符串以“{”开始,用JSONObject解析
JSONObject部分方法
getString(String key)根据键找到对应该的值
getInt(String key) 得到int类型的值
getJSONObject(String key)得到JSONObject
put(String key,String/Boolean/Object^^)
构造方法
new JSONObject(String source) 把对应的String类型的JSON数据转成JSON的对象
new JSONObject(Object bean) 将bean对象转成Json对象,用于转成json字符串
2.当JSON字符串以“[”开始,用JSONArray解析
JSONArray部分方法
getJSONObject(int index);
length()
构造方法
new JSONArray(Collection list)
new JSONArray(String jStr)
注意:
解析时用含参构造创建对象。
组装时用无参构造创建对象。
{}—-遇到{}用JSONObject
[]—-遇到[]用JSONArray
JSON解析的三种方式(都需要自己将jia包导入到相应项目):
1.json原生解析(最灵活,步骤复杂)
步骤:
* 导入jar包
* 看见{},创建JSONObject对象
* 看见[],创建JsonArray对象
private static void testObject() throws JSONException { String jsonStr = "{brand:'宝马',price:150,clr:'red'}"; //1.解析简单对象:参数是要解析的字符串 JSONObject jObject = new JSONObject(jsonStr); //2.解析 Car car = new Car(); String brand = jObject.getString("brand"); car.setBrand(brand); car.setColor(jObject.getString("clr")); car.setPrice(jObject.getInt("price")); System.out.println(car); }
//解析含有数组的字符串 private static void testArray() throws JSONException { String jsonString = "[{brand:'宝马',color:'red',price:150},{brand:'路虎',color:'black',price:180},{brand:'法拉利',color:'yellow',price:200}]"; JSONArray jArray = new JSONArray(jsonString);// System.out.println(jArray.length()); List<Car> carList = new ArrayList<>(); for (int i = 0; i < jArray.length(); i++) { JSONObject jObject = jArray.getJSONObject(i); Car car = new Car(); car.setBrand(jObject.getString("brand")); car.setColor(jObject.getString("color")); car.setPrice(jObject.getInt("price")); carList.add(car); } System.out.println(carList); }
既含有对象也含有数组
public class HWJSON { public static void main(String[] args) throws IOException, JSONException { String url = "http://api.1-blog.com/biz/bizserver/xiaohua/list.do"; String str = new HttpDownload().HttpDownLoad(url);//通过Http请求获得要解析的JSON字符串// System.out.println(str); List<DetailInfo> list = new ArrayList<>();//创建用于存放DetailInfo信息的集合 Info info = new Info(); JSONMethod(str, list, info);//JSON数据解析 info.setDetail(list); System.out.println(info);//输出解析后的结果 } public static void JSONMethod(String str, List<DetailInfo> list, Info info) throws JSONException { JSONObject jo = new JSONObject(str);//将要解析的字符串转为JSON对象 info.setStatus(jo.getString("status")); info.setDesc(jo.getString("desc")); JSONArray jsonObject = jo.getJSONArray("detail"); for (int i = 0; i < jsonObject.length(); i++) { JSONObject jsono = jsonObject.getJSONObject(i); DetailInfo detailInfo = new DetailInfo(); detailInfo.setId(jsono.getInt("id")); detailInfo.setXhid(jsono.getInt("xhid")); detailInfo.setAuthor(jsono.getString("author")); detailInfo.setContent(jsono.getString("content")); detailInfo.setPicUrl(jsono.getString("picUrl")); detailInfo.setStatus(jsono.getInt("status")); list.add(detailInfo); } }}
注:DetailInfo.class 、Info.class、HttpDownload.class三个类由于下面还会调用到,因此放在了文章末尾。
2.gson
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。需要jar包:
用法:
Gson gson=new Gson()
1) fromJson(String json,Class.class)把JSON转成对应的对象【注意】:类和属性和json的键要对应
2) fromJson(String json,new TypeToken
String url = "http://api.1-blog.com/biz/bizserver/xiaohua/list.do"; String str = new HttpDownload().HttpDownLoad(url);//获得要解析的JSON字符串 Gson gson = new Gson(); Info info = gson.fromJson(str, Info.class); System.out.println(info);
3.fastjson
部分方法:
JSON.parseObject(json, Person.class) 把JSON数据转成对象
JSON.parserArray(json,Person.class)把JSON数据转成集合
JSON.toJSONString(Object obj)把对象转成json
String url = "http://api.1-blog.com/biz/bizserver/xiaohua/list.do"; String str = new HttpDownload().HttpDownLoad(url);//获得要解析的JSON字符串 Info info = JSON.parseObject(str,Info.class); System.out.println(info);
Info.class
public class Info { private String status; private String desc; List<DetailInfo> detail; public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public List<DetailInfo> getDetail() { return detail; } public void setDetail(List<DetailInfo> detail) { this.detail = detail; } public Info() { super(); // TODO Auto-generated constructor stub } public Info(String status, String desc, List<DetailInfo> detail) { super(); this.status = status; this.desc = desc; this.detail = detail; } @Override public String toString() { return "Info [status=" + status + ", desc=" + desc + ", detail=" + detail + "]\n"; }}
DetailInfo.class
public class DetailInfo { private int id; private int xhid; private String author; private String content; private String picUrl; private int status; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getXhid() { return xhid; } public void setXhid(int xhid) { this.xhid = xhid; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getPicUrl() { return picUrl; } public void setPicUrl(String picUrl) { this.picUrl = picUrl; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public DetailInfo() { super(); // TODO Auto-generated constructor stub } public DetailInfo(int id, int xhid, String author, String content, String picUrl, int status) { super(); this.id = id; this.xhid = xhid; this.author = author; this.content = content; this.picUrl = picUrl; this.status = status; } @Override public String toString() { return "detail [id=" + id + ", xhid=" + xhid + ", author=" + author + ", content=" + content + ", picUrl=" + picUrl + ", status=" + status + "]\n"; }}
HttpDownload.class
public class HttpDownload { public String HttpDownLoad(String urlStr) throws IOException {//返回字符串 String jsonStr = null;// URL url = new URL(urlStr);// HttpURLConnection connection = (HttpURLConnection) url.openConnection(); HttpURLConnection connection = (HttpURLConnection) new URL(urlStr).openConnection(); int responseCode = connection.getResponseCode(); if (responseCode == 200) { InputStream input = connection.getInputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte buff[] = new byte[1024]; int ret; while ((ret = input.read(buff, 0, buff.length)) != -1) { bos.write(buff, 0, ret); bos.flush(); } jsonStr = new String(bos.toByteArray(), "UTF-8"); } return jsonStr; }}
- JSON解析学习笔记(json、gson、fastjson)
- Json,Gson,FastJson解析笔记
- Json,Gson,FastJson解析笔记
- 【JavaEE学习笔记】JSON解析_原生JSON,GSON,FastJSON
- 简单json,FastJson,Gson解析
- JSON解析-GSON-FastJSON.android
- Android-解析Json(Gson-FastJson)
- JSON的解析[Java-JSON、FastJSON、GSON]
- Android学习(二):解析JSON,GSON,FASTJSON;JDBC编程
- android学习笔记19:FastJson解析json
- android json解析(fastjson,Gson等)
- json解析库gson和fastjson使用
- Json,Gson,FastJson解析数据比较
- 原生态,Gson,FastJson解析Json
- FastJson、Gson、Jackson json解析性能比较
- Gson&FastJson解析异常Json的处理
- Android json解析(FastJson Gson 对比)
- gson解析json字符串学习笔记...
- 图结构练习——最小生成树
- HDU 4548 美素数
- UVA 11419 SAM I AM 二分图+最小覆盖点
- leetcode 32 Longest Valid Parentheses
- XENSERVER虚拟端口IP设置
- JSON解析学习笔记(json、gson、fastjson)
- POJ--2485
- BZOJ 1968: [Ahoi2005]COMMON 约数研究
- SINGLETON宏定义浅析
- 每个人都能徒手写递归神经网络–手把手教你写一个RNN
- 网络编程(二):TCP段格式中的URG与PSH到底有什么不同?
- SQLserver表字段修改后的保存
- 第4章 例题4-1 古老的密码(UVa1339)
- JAVA集合容器--Vector