学习开源JSON框架 -- FastJson,Jackson,Gson

        今天来和大家一起学习一下开源JSON框架。以前听说过同事提起JsonObject是现有json库中提供运行效率最慢的一种,趁着今天有时间,了解了一下相对运行效率比较快的,由Google提供的Gson,Jackson,FastJson框架。

        其中FastJson号称运行效率最快的且使用起来非常简单。下载地址:https://github.com/AlibabaTech/fastjson 

        以下举例几个最常用到转换:

        

pubic class UserInfo implements Serializable{ 
 private String name; 
 private int age; 
 public void setName(String name){ 
  this.name=name; 
 } 
 public String getName(){ 
  return name; 
 } 
    
 public void setAge(int age){ 
  this.age=age; 
 } 
 public int getAge(){ 
  return age; 
 } 
}  
   
//将对象转换成json字符串
public class Test1{ 
    
 public static void main(String[] args){ 
  UserInfo info=new UserInfo(); 
  info.setName("zhangsan"); 
  info.setAge(24); 
  String str_json=JSON.toJSONString(info);  
 } 

}

//将各集合转换成json字符串
public static void test2() { 
   
  HashSet<String, Object> map = new HashMap<String, Object>(); 
  map.put("username", "zhangsan"); 
  map.put("age", 24); 
  map.put("sex", "男"); 
     
  //map集合 
  HashMap<String, Object> temp = new HashMap<String, Object>(); 
  temp.put("name", "xiaohong"); 
  temp.put("age", "23"); 
  map.put("girlInfo", temp); 
   
  //list集合 
  List<String> list = new ArrayList<String>(); 
  list.add("爬山"); 
  list.add("骑车"); 
  list.add("旅游"); 
  map.put("hobby", list); 
     
  /*JSON 序列化,默认序列化出的JSON字符串中键值对是使用双引号,如果需要单引号的JSON字符串, [eg:String jsonString = JSON.toJSONString(map,   SerializerFeature.UseSingleQuotes);]
   *fastjson序列化时可以选择的SerializerFeature有十几个属性,你可以按照自己的需要去选择使用。 
   */ 
  String jsonString = JSON.toJSONString(map); 
   
}

//将json字符串转换为对象
public void test3(){ 
   
 String json="{\"name\":\"chenggang\",\"age\":24}"; 
 UserInfo userInfo=JSON.parseObject(json,UserInfo.class); 
    
} 

//将json字符串转换为集合对象
public static void test4(){ 
  String json="{\"user\":{\"name\":\"zhangsan\",\"age\":25}}"; 
  Map<String, UserInfoBean> map = JSON.parseObject(json, new TypeReference<Map<String, UserInfoBean>>(){});  
//  List<UserInfoBean> list = JSON.parseObject(json, new TypeReference<ArrayList<UserInfoBean>>(){});
//  HashSet<AdvanceHeaderInfo> set = JSON.parseObject(json, new TypeReference<HashSet<AdvanceHeaderInfo>>(){});
 }

//json日期的转换
 public void test5(){ 

  Date date=new Date();   
  //输出毫秒值 
  System.out.println(JSON.toJSONString(date)); 
  //默认格式为yyyy-MM-dd HH:mm:ss   
  System.out.println(JSON.toJSONString(date, SerializerFeature.WriteDateUseDateFormat)); 
  //根据自定义格式输出日期  
  System.out.println(JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd", SerializerFeature.WriteDateUseDateFormat)); 
   
}


        之后是Jackson。Jackson也是运行效率中的佼佼者。下载地址:https://github.com/FasterXML/jackson

        以下举例几个最常用到转换:

         

//初始化bean对象
public class JacksonTest {
    private JsonGenerator jsonGenerator = null;
    private ObjectMapper objectMapper = null;
    private AccountBean bean = null;
    
    @Before
    public void init() {
        bean = new AccountBean();
        bean.setAddress("china-Guangzhou");
        bean.setEmail("[email protected]");
        bean.setId(1);
        bean.setName("hoojo");
        
        objectMapper = new ObjectMapper();
        try {
            jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    @After
    public void destory() {
        try {
            if (jsonGenerator != null) {
                jsonGenerator.flush();
            }
            if (!jsonGenerator.isClosed()) {
                jsonGenerator.close();
            }
            jsonGenerator = null;
            objectMapper = null;
            bean = null;
            System.gc();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

//将对象转换成json字符串
public void writeEntityJSON() {
    
    try {
        System.out.println("jsonGenerator");
        //writeObject可以转换java对象,eg:JavaBean/Map/List/Array等
        jsonGenerator.writeObject(UserInfo);    
        //writeValue具有和writeObject相同的功能
        objectMapper.writeValue(System.out, UserInfo);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
//将各集合转换成json字符串
public void writeMapJSON() {
    try {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", bean.getName());
        map.put("account", bean);
        bean = new AccountBean();
        bean.setAddress("china-Beijin");
        bean.setEmail("[email protected]");
        map.put("account2", bean);
        
        System.out.println("jsonGenerator");
        jsonGenerator.writeObject(map);
        System.out.println("");
        
        System.out.println("objectMapper");
        objectMapper.writeValue(System.out, map);
    } catch (IOException e) {
        e.printStackTrace();
    }
}


public void writeListJSON() {
    try {
        List<AccountBean> list = new ArrayList<AccountBean>();
        list.add(bean);
        
        bean = new AccountBean();
        bean.setId(2);
        bean.setAddress("address2");
        bean.setEmail("email2");
        bean.setName("haha2");
        list.add(bean);
        
        System.out.println("jsonGenerator");
        //list转换成JSON字符串
        jsonGenerator.writeObject(list);
        System.out.println();
        System.out.println("ObjectMapper");
        //用objectMapper直接返回list转换成的JSON字符串
        System.out.println("1###" + objectMapper.writeValueAsString(list));
        System.out.print("2###");
        //objectMapper list转换成JSON字符串
        objectMapper.writeValue(System.out, list);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
//将json字符串转换为对象
public void readJson2Entity() {
    String json = "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}";
    try {
        AccountBean acc = objectMapper.readValue(json, AccountBean.class);
        System.out.println(acc.getName());
        System.out.println(acc);
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

//将json字符串转换为集合对象
public void readJson2List() {
    String json = "[{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+
                "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}]";
    try {
        List<LinkedHashMap<String, Object>> list = objectMapper.readValue(json, List.class);
        System.out.println(list.size());
        for (int i = 0; i < list.size(); i++) {
            Map<String, Object> map = list.get(i);
            Set<String> set = map.keySet();
            for (Iterator<String> it = set.iterator();it.hasNext();) {
                String key = it.next();
                System.out.println(key + ":" + map.get(key));
            }
        }
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void readJson2Array() {
    String json = "[{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+
            "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}]";
    try {
        AccountBean[] arr = objectMapper.readValue(json, AccountBean[].class);
        System.out.println(arr.length);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void readJson2Map() {
    String json = "{\"success\":true,\"A\":{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+
                "\"B\":{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}}";
    try {
        Map<String, Map<String, Object>> maps = objectMapper.readValue(json, Map.class);
        System.out.println(maps.size());
        Set<String> key = maps.keySet();
        Iterator<String> iter = key.iterator();
        while (iter.hasNext()) {
            String field = iter.next();
            System.out.println(field + ":" + maps.get(field));
        }
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

//json日期的转换
public class CustomDateSerializer extends JsonSerializer<Date> { 

        @Override 
        public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
                String formattedDate = formatter.format(value); 
                jgen.writeString(formattedDate); 
        } 
} 

@JsonSerialize(using = CustomDateSerializer.class)   
       public Date getCreateAt() {   
               return createAt;   
       } 

public void timeJson(){
	StringWriter sw = new StringWriter();   
	JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);   
	JacksonUtil.getInstance().writeValue(gen, jsonlist);   
	gen.close();   
	String finalInfo = sw.toString();   
	System.out.println("finalinfo is:"+finalInfo );  
}

         最后是Gson。它会让我们解析json数据变得更简单。下载地址:http://code.google.com/p/google-gson/downloads/list。其中gson-2.24.jar就是我们需要引用的。

         以下举例几个最常用到转换:    


pubic class UserInfo implements Serializable{ 
 private String name; 
 private int age; 
 public void setName(String name){ 
  this.name=name; 
 } 
 public String getName(){ 
  return name; 
 } 
    
 public void setAge(int age){ 
  this.age=age; 
 } 
 public int getAge(){ 
  return age; 
 } 
}  

//将对象转换成json字符串
public void test1(){

	Gson gson = new Gson();
        String str = gson.toJson(UserInfo);
        return str;

}


//将各集合转换成json字符串
public void test2(){

	List<UserInfo> retList = new ArrayList<UserInfo>();
	Gson gson = new Gson();
	String str = gson.toJson(retList);
	return str;

}

//将json字符串转换为对象
public void test3(){

	String jsonData = "{\"username\":\"arthinking\",\"userId\":001}"; 
	Gson gson = new Gson(); 
	User user = gson.fromJson(jsonData, User.class); 
	System.out.println(user.getUsername()); 
	System.out.println(user.getUserId()); 

}
//将json字符串转换为集合对象
public void test4(){

	Gson gson = new Gson(); 
	List<UserInfo> retList = gson.fromJson(jsonstr,  new TypeToken<List<UserInfo>>(){}.getType());

}

                       想学习更多Jackson的使用,请参考:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html


猜你喜欢

转载自blog.csdn.net/dengyanyi11/article/details/44782633