前言
有段时间没接触JSON了,在实际工作中,大部分项目都有了现成的JSON使用规范,但是最近自己独立开发项目的时候,发现配置一个JSON居然显得那么的不熟悉,各种百度,各种凌乱的问题,这里还是老实点,做个总结吧。
JSONObject
一般生成json字符串有三种方式,1、直接利用JSONObject进行put操作,2、利用Map构建json对象,3、利用Java对象构建json字符串
下面统一构建一个json对象,具体格式如下:
{
"name":"王小二",
"age":"25",
"birthday":"1992-01-01",
"school":"蓝翔",
"major":["理发","挖掘机"],
"has_girlFriend":true,
"car":true,
"house":true,
"comment":"这是一个注释"
}
直接手动构建JSONObject
直接手动构建JSONObject就是将一个个元素手动放到JSONObject中,这种无异于原始社会的操作,技术含量偏低,这里只给出实例吧
/**
* 直接手动构建JSONObject
*/
private static void JSONObjectDemo(){
Object nullObj = null;
JSONObject person = new JSONObject();
person.put("name","王小二");
person.put("age",25);
person.put("birthday","1990-01-01");
person.put("school","蓝翔");
person.put("major",new String[]{"理发","挖掘机"});
person.put("has_girlFirend",true);
person.put("car",nullObj);
person.put("house",true);
person.put("comment","这是一个注释");
System.out.println(person.toString());
}
利用map构建JSONObject
在构建JSONObject对象的时候可以指定map类型的对象
/**
* 利用map构建json对象
*/
private static void createJsonObjectByMap(){
Map<String,Object> person = new HashMap<String,Object>();
Object nullObj = null;
person.put("name","王小二");
person.put("age",25);
person.put("birthday","1990-01-01");
person.put("school","蓝翔");
person.put("major",new String[]{"理发","挖掘机"});
person.put("has_girlFirend",true);
person.put("car",nullObj);
person.put("house",true);
person.put("comment","这是一个注释");
JSONObject personJson = new JSONObject(person);
System.out.println(personJson.toString());
}
利用JavaBean对象构建JSONObject
JSONObject的构造函数,同样也能传递一个JavaBean对象,其实JSONObject的构造函数接受参数是一个Object,因此大部分的java对象都能构造成json,这里只是总结了常用的三种构建JSONObject的方式
/**
* 利用javaBean构建json对象
*/
private static void createJsonObjectFromBean(){
Person person = new Person();
person.setName("王小二");
person.setAge(25.2);
person.setBirthday("1990-01-01");
person.setSchool("蓝翔");
person.setMajor(new String[]{"理发","挖掘机"});
person.setHasGirlFriend(true);
person.setHouse(true);
person.setCar(null);
person.setComment("这是一个注释");
JSONObject jsonObjectPerson = new JSONObject(person);
System.out.println(jsonObjectPerson.toString());
}
测试结果:
JSONObject的解析
其实JSONObject的解析也异常简单,只是需要注意JSONArray的解析,其余的都大同小异,哎,还是直接上实例吧
package com.learn.json.JSONDemo.readJson;
import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
/**
* autor:liman
* comment:
* 获取json数据,并解析json数据
*/
public class ReadJsonDemo {
public static void main(String[] args) throws IOException {
//读取文件
File file = new File(ReadJsonDemo.class.getResource("/person.json").getFile());
String content = FileUtils.readFileToString(file);
//根据字符串转换成JSONObject
JSONObject jsonObject = new JSONObject(content);
//JSON数据的判空操作
if(!jsonObject.isNull("nickName")){
System.out.println("昵称是:"+jsonObject.get("nickName"));
}
System.out.println("姓名是:"+jsonObject.getString("name"));
System.out.println("年龄是:"+jsonObject.getDouble("age"));
System.out.println("是否有媳妇:"+jsonObject.getBoolean("has_girlFriend"));
//jsonArray的转换需要注意
JSONArray majorArray = jsonObject.getJSONArray("major");
for(int i =0;i<majorArray.length();i++){
System.out.println(majorArray.get(i));
}
}
}
实例异常简单
GSON
在实际开发中用的较多的json转换工具就是GSON了,能较方便的将json与java对象进行相互转换,这个不是JSONObject能做到的,同时GSON还支持转换的定制化操作。
先给出对应的bean实例
package com.learn.json.JSONDemo.bean;
import com.google.gson.annotations.SerializedName;
import java.util.Arrays;
/**
* autor:liman
* comment:
*/
public class Person {
// @SerializedName("NAME") //这个注解来自于GSON,可以允许名称自定义
private String name;
private String school;
private boolean hasGirlFriend;
private double age;
private Object car;
private Object house;
private String[] major;
private String comment;
private String birthday;
private transient String ignore;
/**
省略getter和setter操作
**/
}
1、JSON与对象的相互转换
将对象转换成json字符串
package com.learn.json.JSONDemo.GSON;
import com.google.gson.FieldNamingStrategy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.learn.json.JSONDemo.bean.Person;
import java.lang.reflect.Field;
/**
* autor:liman
* comment:
* GSON的使用方式
*/
public class GSONDemo {
public static void main(String[] args) {
Person person = new Person();
person.setName("王小二");
person.setAge(25.2);
person.setBirthday("1990-01-01");
person.setSchool("蓝翔");
person.setMajor(new String[]{"理发","挖掘机"});
person.setHasGirlFriend(true);
person.setHouse(true);
person.setCar(null);
person.setComment("这是一个注释");
person.setIgnore("不要看见我");
//生成json字符串,这种方式和JSONObject原生差不多
Gson gson = new Gson();
System.out.println(gson.toJson(person));
//在生成json字符串之前,利用builder进行相关操作
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setPrettyPrinting();
//构建json数据的时候,可以修改名字
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
@Override
public String translateName(Field field) {
if("name".equals(field.getName()))
{return "NAME";}
return field.getName();
}
});
Gson gsonbyBuilder = gsonBuilder.create();
System.out.println(gsonbyBuilder.toJson(person));
}
}
在构建json转换的时候,主要是toJson这个方法,在正式转换成json字符串的时候,还可以手动构建相关属性,利用GsonBuilder去设置相关策略。如上述代码所示。其中就针对name属性的名称做了修改。同时也做了格式化输出,最终结果如下:
将JSON字符串解析成指定对象
GSON比JSONObject优秀的地方就在于,能完成JSON字符串到java对象的映射。当然现在很多json解析包都能完成这个功能。这里只总结了GSON,但在使用方面都大同小异。
package com.learn.json.JSONDemo.GSON;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.learn.json.JSONDemo.bean.Person;
import com.learn.json.JSONDemo.bean.PersonWithDate;
import com.learn.json.JSONDemo.bean.PersonWithList;
import com.learn.json.JSONDemo.readJson.ReadJsonDemo;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
/**
* autor:liman
* comment:
* 使用GSON对json字符串进行解析
*/
public class GSONDeserializeDemo {
public static void main(String[] args) throws IOException {
//读取文件
File file = new File(ReadJsonDemo.class.getResource("/person.json").getFile());
String content = FileUtils.readFileToString(file);
//相比JSONObject来说,这个可以解析成指定的对象,而JSONObject不行
Gson gson = new Gson();
Person person = gson.fromJson(content, Person.class);
System.out.println(person.toString());
//日期格式的转换
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gsonDate = gsonBuilder.setDateFormat("yyyy-MM-dd").create();
PersonWithDate personWithDate = gsonDate.fromJson(content, PersonWithDate.class);
System.out.println(personWithDate.getBirthday().toLocaleString());
//GSON可以将json中的数组和Java集合进行无缝对接
Gson gsonCollection = gsonBuilder.create();
PersonWithList personWithList = gsonCollection.fromJson(content, PersonWithList.class);
System.out.println(personWithList.getMajor());
System.out.println(personWithList.getMajor().getClass().getSimpleName());
}
}
重点是gson.fromJson(content,Person.class)这个方法,这个方法将json字符串解析成指定的对象。
2、JSON日期格式的转换
依旧是上述的实例,重点是以下几行代码
//日期格式的转换
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gsonDate = gsonBuilder.setDateFormat("yyyy-MM-dd").create();
PersonWithDate personWithDate = gsonDate.fromJson(content, PersonWithDate.class);
System.out.println(personWithDate.getBirthday().toLocaleString());
通过GsonBuilder设置日期格式的转换,PersonWithDate对象只是将Person对象中的birthDay属性修改成了Date属性
3、JSON的集合对象的转换
//GSON可以将json中的数组和Java集合进行无缝对接
Gson gsonCollection = gsonBuilder.create();
PersonWithList personWithList = gsonCollection.fromJson(content, PersonWithList.class);
System.out.println(personWithList.getMajor());
System.out.println(personWithList.getMajor().getClass().getSimpleName());
PersonWithList对象中,已经将Major属性修改成了List属性,这里也没有做什么操作,直接进行转换。GSON可以将JSONArray与java对象的集合进行无缝对接。
总结
easy,非常之easy,针对多对象的依赖转换成json没有提及,尤其是循环依赖问题,后续会补上。