一、JSON是什么?
JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。
JSON就是一串字符串 只不过元素会使用特定的符号标注。
存储结构是 KEY-VALUE
key为string类型
value为: String Boolean Number 数组 Object null
[] 中括号代表的是一个数组;
{} 大括号代表的是一个对象
"" 双引号表示的是属性值
:冒号代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。
"格式完好"的JSON,就是要求指定的字符串必须符合严格的JSON格式,属性名称必须加双引号、字符串值也必须用双引号。例如:
{
"name": "teacher",
"computer": {
"CPU": "intel7",
"disk": "512G"
},
"students": [
{
"name": "张三",
"age": 18,
"sex": true
},
{
"name": "李四",
"age": 19,
"sex": false
}
]
}二、JS
ON生成以及解析
我们经常用到的是实体类转换成JSONObject对象,以及解析JSON;
(1)四种实体类生成Json字符串:
public void EntityToJson() throws IOException {
Person person = new Person("张三", "男", 25);
//1、利用传统方式
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", person .getName());
jsonObject.put("sex", person .getSex());
jsonObject.put("age", person .getAge());
jsonObject.toString());
//2、利用Jackson方式
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValueAsString(person);
//3、利用GSON方式
Gson gson = new Gson();
gson.toJson(person);
//4、利用FastJSON方式
Object jsonString = JSON.toJSON(person);
System.out.println(jsonString.toString());
}
(2)Json字符串生成实体类
JSON解析一定要掌握的两条规则:
- 1.如果看到是{ }–>使用JSONObject
- 2.如果看到的[ ]–>使用JSONArray解析
public void JsonToEntity(){
String jsonString = "{\"sex\":\"男\",\"name\":\"张三\",\"age\":25}";
//1、利用传统方式
JSONObject jsonObject = new JSONObject(jsonString);
jsonObject.get("name").toString(), jsonObject.get("sex").toString(), Integer.valueOf(jsonObject.get("age").toString()));
//2、利用Jackson方式
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.readValue(jsonString, Person.class);
//3、利用GSON方式
Gson gson = new Gson();
Person person = gson.fromJson(jsonString, Person.class);
//4、利用FastJSON方式
Person person = JSON.parseObject(jsonString, Person.class);
}
另外:对于数组来说GSON和FastJSON各有自己的解析方式;详细方法参照API;
List<String> list =gson.fromJson(json2, new TypeToken<List<String>>(){}.getType());
List<Person > person List =gson.fromJson(json3, new TypeToken<List<Person >>(){}.getType());
List<String> list = JSON.parseArray(json2, String.class);
List<Person > userList = JSON.parseArray(json3, Person .class);
(3)根据JSON建立对象
{
"desc": "OK",
"status": 1000,
"data": {
"wendu": "20",
"ganmao": "相对于今天将会出现大幅度降温,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。",
"forecast": [
{
"fengxiang": "北风",
"fengli": "3-4级",
"high": "高温 27℃",
"type": "中雨",
"low": "低温 19℃",
"date": "6日星期五"
},
{
"fengxiang": "北风",
"fengli": "微风级",
"high": "高温 23℃",
"type": "大雨",
"low": "低温 17℃",
"date": "7日星期六"
},
{
"fengxiang": "北风",
"fengli": "微风级",
"high": "高温 26℃",
"type": "小雨",
"low": "低温 17℃",
"date": "8日星期天"
},
{
"fengxiang": "南风",
"fengli": "微风级",
"high": "高温 27℃",
"type": "多云",
"low": "低温 15℃",
"date": "9日星期一"
},
{
"fengxiang": "南风",
"fengli": "微风级",
"high": "高温 29℃",
"type": "多云",
"low": "低温 16℃",
"date": "10日星期二"
}
],
"yesterday": {
"fl": "微风",
"fx": "北风",
"high": "高温 33℃",
"type": "阴",
"low": "低温 22℃",
"date": "5日星期四"
},
"aqi": "58",
"city": "成都"
}
}
数据略大,不方便看,这里给大家提供一个JSON在线解析工具http://www.bejson.com/count.html 自动格式化,方便观看。
分析:
一: 第一个大括号(JSONObject){”desc”: “status”: “data”}
二:data里面有一个大括号(JSONObject){”wendu” , “ganmao”, “forecast”, “yesterday”, “aqi”, “city” }
三:第二个大括号里面有两个对象 1.数组形“forecast”(JSONArray) 2.对象形“yesterday”( JSONObject )
而数组形里面又套有数组的对象{}
开始封装字段:
import java.util.List;
/**
* 对应的字段的封装
*/
public class Weather {
// 外面大括号的字段封装 setter getter toString
public String desc;
public int status;
public Data data;
@Override
public String toString() {
return "Weather [desc=" + desc + ", status=" + status + ", data="
+ data + "]";
}
}class Data{
// 里面大括号的字段封装 setter getter toString
// 该类中包含有数组形和对象形,需要一并的封装在里面
public String wendu;
public String ganmao;
public List<Forecast> forecast;
public Yesterday yesterday;
public String aqi;
public String city;
@Override
public String toString() {
return "Data [wendu=" + wendu + ", ganmao=" + ganmao + ", forecast="
+ forecast + ", yesterday=" + yesterday + ", aqi=" + aqi
+ ", city=" + city + "]";
}
}class Forecast{
// 数组里面的大括号类型字段的封装
public String fengxiang;
public String fengli;
public String high;
public String type;
public String low;
public String date;
@Override
public String toString() {
return "Forecast [fengxiang=" + fengxiang + ", fengli=" + fengli
+ ", high=" + high + ", type=" + type + ", low=" + low
+ ", date=" + date + "]";
}
}
class Yesterday{
// 最后{}的字段封装
public String fl;
public String fx;
public String high;
public String type;
public String low;
public String date;
@Override
public String toString() {
return "Yesterday [fl=" + fl + ", fx=" + fx + ", high=" + high
+ ", type=" + type + ", low=" + low + ", date=" + date + "]";
}}
将数据封装成json格式
json有两种格式:
(1)对象格式: JSONObject.fromObject{“key1”:obj,”key2”:obj,”key3”:obj…}
1、Map集合
Map map = new HashMap();
map.put("name", "json");
map.put("bool", Boolean.TRUE);
map.put("int", new Integer(1));
map.put("arr", new String[] { "a", "b" });
JSONObject json = JSONObject.fromObject(map);
————————————————2、Bean
JSONObject jsonObject = JSONObject.fromObject(new JsonBean());
————————————————
(2)数组/集合格式: JSONArray.fromObject
[obj,obj,obj…]1、数组
boolean[] boolArray = new boolean[] { true, false, true };
JSONArray jsonArray1 = JSONArray.fromObject(boolArray);————————————————
2、一般数据
JSONArray jsonArray2 = JSONArray.fromObject("['json','is','easy']" );
————————————————
3、List集合
List list = new ArrayList();
list.add( "first" );
list.add( "second" );
JSONArray jsonArray3 = JSONArray.fromObject( list );
————————————————