json转换
# google gson
/**
* 使用GsonBuilder创建Gson实例的步骤:
* 首先创建GsonBuilder,然后调用GsonBuilder提供的各种配置方法进行配置,
* 最后调用GsonBuilder的create方法,将基于当前的配置创建一个Gson实例。
*
* GsonBuilder的一些配置
* Gson gson = new GsonBuilder()
* .excludeFieldsWithoutExposeAnnotation() //不对没有用@Expose注解的属性进行操作
* .enableComplexMapKeySerialization() //当Map的key为复杂对象时,需要开启该方法
* .serializeNulls() //当字段值为空或null时,依然对该字段进行转换
* .setLongSerializationPolicy(LongSerializationPolicy.STRING)// 把 long 类型 改成String类型 也可以自定义类型
* .setDateFormat("yyyy-MM-dd HH:mm:ss:SSS") //时间转化为特定格式
* //Date时间转化为long类型
* .registerTypeAdapter(java.util.Date.class, new DateSerializer()).setDateFormat(DateFormat.LONG)
* .registerTypeAdapter(java.util.Date.class, new DateDeserializer()).setDateFormat(DateFormat.LONG)
* .setPrettyPrinting() //格式化输出json字符串:对结果进行格式化,增加换行
* .disableHtmlEscaping() //防止特殊字符出现乱码
* .registerTypeAdapter(User.class,new UserAdapter()) //为某特定对象设置固定的序列或反序列方式,自定义Adapter需实现JsonSerializer或者JsonDeserializer接口
* .create();
*
* //date序列化为long
* class DateSerializer implements JsonSerializer<Date> {
* public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
* return new JsonPrimitive(src.getTime());
* }
* }
*
* class DateDeserializer implements JsonDeserializer<Date> {
* public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
* return new java.util.Date(json.getAsJsonPrimitive().getAsLong());
* }
* }
*/
//对象 <--> json
Mather m = new Mather();
String jsonStr = new Gson().toJson(m, Mather.class);//不转换null属性
Mather ma = new Gson().fromJson(jsonStr, Mather.class);//不转换null属性
String jsonStr_2 = new GsonBuilder().serializeNulls().create().toJson(m, Mather.class);//转换null属性
Mather ma = new GsonBuilder().serializeNulls().create().fromJson(jsonStr, Mather.class);//转换null属性
Family fa = new Gson().fromJson(jsonStr, Family.class);//对象中有List<Child>, 支持复杂嵌套
//list <--> json
String jsonStr = new Gson().toJson(new ArrayList<>());//["1111","2222",null,"3333"]
List<String> list = new Gson().fromJson(jsonStr, List.class);
List<String> retList = new Gson().fromJson(jsonStr, new TypeToken<List<String>>(){}.getType());
//map <--> json
String jsonStr = new Gson().toJson(new HashMap<>());//{"a":"b","c":"e","h":"g"}
Map<String, String> map = new Gson().fromJson(jsonStr, new TypeToken<Map<String, String>>(){}.getType());
//map<List> <--> json
Map<Integer, List<Child>> ageRank = new Gson().fromJson(jsonStr,new TypeToken<Map<Integer, List<Child>>>(){}.getType());
//json串转List+日期格式化
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").setLongSerializationPolicy(LongSerializationPolicy.STRING).create();
List<EasstColumnDo> columnList = gson.fromJson(fieldsJson, new TypeToken<List<EasstColumnDo>>() {}.getType());
//List<map> <--> json
List<Map<String, String>> listMap = new Gson().fromJson(jsonStr, List.class);
List<Map<String, String>> maps = new Gson().fromJson(sortList, new TypeToken<List<Map<String, String>>>(){}.getType());
//json串转List<map>+日期格式化
String responseJson = "";
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").setLongSerializationPolicy(LongSerializationPolicy.STRING).create();
List<Map<String, String>> mapList = gson.fromJson(responseJson, new TypeToken<List<Map<String, String>>>() {}.getType());
//Gson 跳过html特殊符号转码的方法, 如?<>会转成unicode
Map<String, String> source = new HashMap<>();
source.put("str", "表单<table><tr><td>物品</td></tr></table>");
System.out.println(new GsonBuilder().create().toJson(source));//错误方式 {"str":"表单\u003ctable\u003e\u003ctr\u003e\u003ctd\u003e物品\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e"}
System.out.println(new GsonBuilder().disableHtmlEscaping().create().toJson(source));//正确方式 {"str":"表单<table><tr><td>物品</td></tr></table>"}
//部分实体对象不转成json属性(实体类转Json时 or 反序列化实体类数据,忽略掉某些字段)
//将Gson配置为在序列化或反序列化时,排除所有 没有@Expose注解的字段。
public class MenuInfo {
@Expose
private Long id;
@Expose
private String appId;
@Expose
private String menuName;
@Expose
private List<String> pathNames;
private boolean deleted;//true:需要删除,false:不需要删除
}
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
String jsonStr = gson.toJson(menuInfo);//可以看到deleted字段没有了 {"id":1,"appId":"abc","type":1,"menuName":"abc","pathNames":["测试","abc","123"]}
# alibaba fastjson
一. fastjson生成json字符串(JavaBean,List<JavaBean>,List<String>,List<Map<String,Object>)
String jsonString = JSON.toJSONString(object);
二. fastjson 解析json字符串为四种类型
1. JavaBean
Person person = JSON.parseObject(jsonString, Person.class);
2. List<JavaBean>
List<Person> listPerson =JSON.parseArray(jsonString, Person.class);
3. List<String>
List<String> listString = JSON.parseArray(jsonString, String.class);
4. List<Map<String,Object>>
String jsonString = "";//示例:[{"size":10,"appId":"1","dictName":"leaveType"},{"isPY":"true","size":3736,"appId":"1","dictName":"persons"}]
List<Map<String, Object>> listMap = JSON.parseObject(jsonString, new TypeReference<List<Map<String,Object>>>(){}); (注意:此处可看出fastjson反射机制比gson更准确, id = 1001 通过fastjson反射仍是 id = 1001 , 而通过gson反射结果 为 id =1001.0
String jsonStr = "{\"JACKIE_ZHANG\":\"张学友\",\"ANDY_LAU\":\"刘德华\",\"LIMING\":\"黎明\",\"Aaron_Kwok\":\"郭富城\"}" ;
JSONObject jsonObject = JSONObject.parseObject(jsonStr) ;
String jsonStr = "[{\"JACKIE_ZHANG\":\"张学友\"},{\"ANDY_LAU\":\"刘德华\"},{\"LIMING\":\"黎明\"},{\"Aaron_Kwok\":\"郭富城\"}]" ;
JSONArray jsonArray = JSONArray.parseArray(jsonStr);
1、//将map转换成jsonObject
JSONObject itemJSONObj = JSONObject.parseObject(JSON.toJSONString(itemMap));
将Map类型的itemInfo转换成json,再经JSONObject转换实现。
2、//将jsonObj转换成Map
Map<String, Object> itemMap = JSONObject.toJavaObject(itemJSONObj, Map.class);
//JSON.parseObjet()方法同样可以转换
3、//将List转换成JSONArray
JSONArray ja = JSONArray.parseArray(JSON.toJSONString(itemList));
//获取string值
JSONObject jsonObject = new JSONObject();
String str1 = jsonObject.optString("userName");//值是null、key不存在时:返回空字符串“”
String str2 = jsonObject.optString("userName","默认6");//值是null、key不存在时:返回指定的默认值
String str3 = jsonObject.getString("userName");//值是null、key不存在时:会抛出异常
// 将json字符串转换为json对象
JSONObject jsonObj = new JSONObject(jsonStr);
//json对象转json字符串
String jsonStr = JSONObject.fromObject(User对象 或 map对象).toString();
// 得到指定json key对象的value对象
JSONObject personObj = jsonObj.getJSONObject("person");
//Object对象转json对象
JSONObject jsonObj = JSONObject.fromObject(obj);
//Object对象转jsonArray对象
JSONArray jsonArray = JSONArray.fromObject(obj);
//jsonArray转json字符串
String jsonStr = JSONArray.fromObject(list类型的对象).toString();
// 获取json对象的所有属性
int id = personObj.getInt("id");
String name = personObj.getString("name");
// 得到指定json key对象的value对象
JSONArray personList = jsonObj.getJSONArray("persons");
// 遍历jsonArray
for (int i = 0; i < personList.length(); i++){
// 获取每一个json对象
JSONObject jsonItem = personList.getJSONObject(i);
// 获取每一个json对象的值
Person person = new Person();
person.setId(jsonItem.getInt("id"));
person.setName(jsonItem.getString("name"));
person.setAddress(jsonItem.getString("address"));
list.add(person);
}
//map转json串
Map<String, Object> data =new HashMap<>();
System.out.println("json字符串:"+ JSONObject.fromObject(paramMap).toString());
//list转json串
JsonUtil.toJSON(page.getList()).toString()