Json:提供对象序列化的方式
1.JSON基础知识
JSON是一种与开发语言无关的,轻量级的 数据格式,全名JavaScript Object Notation。
易读易编写易编译。
(1)标准的JSON数据表示
数据结构:Object Array
基本类型:string,number,true,false,null
a.Object:
花括号{}包含的键值对结构,Key必须时string类型,value为任何基本类型或数据结构
b.Array:
中括号[]来起始,用逗号,来分隔元素
例子:example.json
{
"name":"沈小涛", //string
"age":20.1,//number
"birthday":1998-06-18"
"school":"蓝翔技校",
"major":["理发","挖掘机"],//Array
"has_girlfriend":false,
"car":null,
}
2.常见的JSON处理方式
比较适合在移动端进行开发。
(1)java后台生成json数据
一共有三种方法实现:直接使用JSONObject;使用hashMap;使用javaBean,推荐使用Java Bean实现。代码如下:
JSONObject:
private static void jSONObjectsample() {
// TODO Auto-generated method stub
Object nullObj =null;
JSONObject xiaokeai=new JSONObject();
xiaokeai.put("name","小可爱");
xiaokeai.put("age", 20.2);
xiaokeai.put("birthday", "1998-06-16");
xiaokeai.put("school", "蓝翔技校");
xiaokeai.put("major", new String[] {"理发","挖掘机"});
xiaokeai.put("has_girlfriend", false);
xiaokeai.put("car", nullObj);
xiaokeai.put("comment", "这是一个注释");
System.out.println(xiaokeai.toString());
}
HashMap:
private static void createJsonByMap() {
Map<String,Object> xiaokeai =new HashMap<String,Object>();
Object nullObj =null;
xiaokeai.put("name","小可爱");
xiaokeai.put("age", 20.2);
xiaokeai.put("birthday", "1998-06-16");
xiaokeai.put("school", "蓝翔技校");
xiaokeai.put("major", new String[] {"理发","挖掘机"});
xiaokeai.put("has_girlfriend", false);
xiaokeai.put("car", nullObj);
xiaokeai.put("comment", "这是一个注释");
System.out.println(new JSONObject(xiaokeai).toString());
}
Java Bean:
使用JavaBean时首先应定义对应存放数据类型的类,通过set方法赋值。
public static void createJsonByBean() {
Object nullObj =null;
Diaosi xiaokeai=new Diaosi();
xiaokeai.setAge(20.2);
xiaokeai.setBirthday("1998-06-16");
xiaokeai.setName("小可爱");
xiaokeai.setCar(nullObj);
xiaokeai.setComment("这是一个注释");
xiaokeai.setHas_girlfriend(false);
xiaokeai.setSchool("蓝翔技校");
xiaokeai.setMajor(new String[] {"理发","挖掘机"});
System.out.println(new JSONObject(xiaokeai));
}
(2)通过JSONObject解析JSON文件
代码如下:
xiaokeai.json
{
"birthday": "1998-06-16",
"major": [
"理发",
"挖掘机"
],
"school": "蓝翔技校",
"name": "小可爱",
"has_girlfriend": false,
"comment": "这是一个注释",
"age": 20.2
}
ReadJsonSample.java
File file =
new File(ReadJsonSample.class.getResource("/xiaokeai.json").getFile());
String content= FileUtils.readFileToString(file);
JSONObject jsonObject =new JSONObject(content);
//isnull用于判断jsonObject中是否有该字段,用以提升程序的健壮性
if(!jsonObject.isNull("nickname")){
System.out.println(jsonObject.getString("nickname"));
}
System.out.println("姓名是:"+jsonObject.getString("name"));
System.out.println("年龄是:"+jsonObject.getDouble("age"));
System.out.println("是否有女朋友:"+jsonObject.getBoolean("has_girlfriend"));
//JSONObject无法直接解析数组,需要通过JSONArray进行解析
JSONArray majorArray=jsonObject.getJSONArray("major");
Object String;
for(int i=0;i<majorArray.length();i++)
System.out.println("专业"+i+majorArray.get(i));
3.GSON介绍
相比于JSONObject,使用更为便捷和简单,功能更加的强大,比较适合在服务端进行开发。
首先要在maven仓库中添加google的gson开源jar包。
(1)Gson生成json数据
代码如下:
//Diaosi的Bean数据结构
@SerializedName("name")
private String name;
private String school;
private boolean has_girlfriend;
private double age;
private Object car;
private String[] major;
private String comment;
private String birthday;
private transient String ignore;
//Gson生成json的代码实现
public static void main(String[]args) {
Object nullObj =null;
Diaosi xiaokeai=new Diaosi();
xiaokeai.setAge(20.2);
xiaokeai.setBirthday("1998-06-16");
xiaokeai.setName("小可爱");
xiaokeai.setCar(nullObj);
xiaokeai.setComment("这是一个注释");
xiaokeai.setHas_girlfriend(false);
xiaokeai.setSchool("蓝翔技校");
xiaokeai.setMajor(new String[] {"理发","挖掘机"});
xiaokeai.setIgnore("不要看见我");
GsonBuilder gsonBuilder=new GsonBuilder();
gsonBuilder.setPrettyPrinting();
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy(){
public String translateName(Field f) {
if(f.getName().equals("name")) {
return "NAME";
}
return f.getName();
}
});
Gson gson=gsonBuilder.create();//方法2
Gson gson1=new Gson();//方法1
System.out.println(gson.toJson(xiaokeai));
和JSONObeject一样,我们通过Java Bean将数据导入,不同的是,通过Gson类创建对象,调用.toJson()方法生成Json对象。
tips:
1.为满足个性化的定制,我们可通过GsonBuilder类实现。调用.setFieldNamingStrategy()方法,创建一个函数,对Json出的数据进行自定义的定制。
2.使用 transient将数据隐藏。
3. 使用@SerializedName("name")进行大小写切换。
(2)Gson解析
File file =
new File(ReadJsonSample.class.getResource("/xiaokeai.json").getFile());
String content= FileUtils.readFileToString(file);
Gson gson=new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
Diaosii xiaokeai=gson.fromJson(content,Diaosii.class);
System.out.println(xiaokeai.getMajor());
System.out.println(xiaokeai.getMajor().getClass());
a.实现date日期格式的转换
Gson gson=new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
b.实现数组和集合类的转换