zbo2018
5/21/2018 - 11:38 AM

json 操作

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()