java中的JSon解析


1、DTO:Data Transfer Object,數據傳送對象  
  
2、對於日期格式的問題,也已經處理  
  
3、json-lib-2.2.2-jdk13.jar (2.1在日期數組 json->java有問題)  
  
工具類JsonUtil代碼如下:  
  
Java代碼   
public class JsonUtil {     
    
    /**頁面傳至后台時,json數據在request的參數名稱*/    
    public final static String JSON_ATTRIBUTE = "json";     
    public final static String JSON_ATTRIBUTE1 = "json1";     
    public final static String JSON_ATTRIBUTE2 = "json2";     
    public final static String JSON_ATTRIBUTE3 = "json3";     
    public final static String JSON_ATTRIBUTE4 = "json4";     
         
    /**   
     * 從一個JSON 對象字符格式中得到一個java對象,形如:   
     * {"id" : idValue, "name" : nameValue, "aBean" : {"aBeanId" : aBeanIdValue, ...}}   
     * @param object   
     * @param clazz   
     * @return   
     */    
    public static Object getDTO(String jsonString, Class clazz){     
        JSONObject jsonObject = null;     
        try{     
            setDataFormat2JAVA();      
            jsonObject = JSONObject.fromObject(jsonString);     
        }catch(Exception e){     
            e.printStackTrace();     
        }     
        return JSONObject.toBean(jsonObject, clazz);     
    }     
         
    /**   
     * 從一個JSON 對象字符格式中得到一個java對象,其中beansList是一類的集合,形如:   
     * {"id" : idValue, "name" : nameValue, "aBean" : {"aBeanId" : aBeanIdValue, ...},   
     * beansList:[{}, {}, ...]}   
     * @param jsonString   
     * @param clazz   
     * @param map 集合屬性的類型 (key : 集合屬性名, value : 集合屬性類型class) eg: ("beansList" : Bean.class)   
     * @return   
     */    
    public static Object getDTO(String jsonString, Class clazz, Map map){     
        JSONObject jsonObject = null;     
        try{     
            setDataFormat2JAVA();      
            jsonObject = JSONObject.fromObject(jsonString);     
        }catch(Exception e){     
            e.printStackTrace();     
        }     
        return JSONObject.toBean(jsonObject, clazz, map);     
    }     
         
    /**   
     * 從一個JSON數組得到一個java對象數組,形如:   
     * [{"id" : idValue, "name" : nameValue}, {"id" : idValue, "name" : nameValue}, ...]   
     * @param object   
     * @param clazz   
     * @return   
     */    
    public static Object[] getDTOArray(String jsonString, Class clazz){     
        setDataFormat2JAVA();     
        JSONArray array = JSONArray.fromObject(jsonString);     
        Object[] obj = new Object[array.size()];     
        for(int i = 0; i < array.size(); i++){     
            JSONObject jsonObject = array.getJSONObject(i);     
            obj[i] = JSONObject.toBean(jsonObject, clazz);     
        }     
        return obj;     
    }     
         
    /**   
     * 從一個JSON數組得到一個java對象數組,形如:   
     * [{"id" : idValue, "name" : nameValue}, {"id" : idValue, "name" : nameValue}, ...]   
     * @param object   
     * @param clazz   
     * @param map   
     * @return   
     */    
    public static Object[] getDTOArray(String jsonString, Class clazz, Map map){     
        setDataFormat2JAVA();     
        JSONArray array = JSONArray.fromObject(jsonString);     
        Object[] obj = new Object[array.size()];     
        for(int i = 0; i < array.size(); i++){     
            JSONObject jsonObject = array.getJSONObject(i);     
            obj[i] = JSONObject.toBean(jsonObject, clazz, map);     
        }     
        return obj;     
    }     
         
    /**   
     * 從一個JSON數組得到一個java對象集合   
     * @param object   
     * @param clazz   
     * @return   
     */    
    public static List getDTOList(String jsonString, Class clazz){     
        setDataFormat2JAVA();     
        JSONArray array = JSONArray.fromObject(jsonString);     
        List list = new ArrayList();     
        for(Iterator iter = array.iterator(); iter.hasNext();){     
            JSONObject jsonObject = (JSONObject)iter.next();     
            list.add(JSONObject.toBean(jsonObject, clazz));     
        }     
        return list;     
    }     
         
    /**   
     * 從一個JSON數組得到一個java對象集合,其中對象中包含有集合屬性   
     * @param object   
     * @param clazz   
     * @param map 集合屬性的類型   
     * @return   
     */    
    public static List getDTOList(String jsonString, Class clazz, Map map){     
        setDataFormat2JAVA();     
        JSONArray array = JSONArray.fromObject(jsonString);     
        List list = new ArrayList();     
        for(Iterator iter = array.iterator(); iter.hasNext();){     
            JSONObject jsonObject = (JSONObject)iter.next();     
            list.add(JSONObject.toBean(jsonObject, clazz, map));     
        }     
        return list;     
    }     
         
    /**   
     * 從json HASH表達式中獲取一個map,該map支持嵌套功能   
     * 形如:{"id" : "johncon", "name" : "小強"}   
     * 注意commons-collections版本,必須包含org.apache.commons.collections.map.MultiKeyMap   
     * @param object   
     * @return   
     */    
    public static Map getMapFromJson(String jsonString) {     
        setDataFormat2JAVA();     
        JSONObject jsonObject = JSONObject.fromObject(jsonString);     
        Map map = new HashMap();     
        for(Iterator iter = jsonObject.keys(); iter.hasNext();){     
            String key = (String)iter.next();     
            map.put(key, jsonObject.get(key));     
        }     
        return map;     
    }     
         
    /**   
     * 從json數組中得到相應java數組   
     * json形如:["123", "456"]   
     * @param jsonString   
     * @return   
     */    
    public static Object[] getObjectArrayFromJson(String jsonString) {     
        JSONArray jsonArray = JSONArray.fromObject(jsonString);     
        return jsonArray.toArray();     
    }     
    
    
    /**   
     * 把數據對象轉換成json字符串   
     * DTO對象形如:{"id" : idValue, "name" : nameValue, ...}   
     * 數組對象形如:[{}, {}, {}, ...]   
     * map對象形如:{key1 : {"id" : idValue, "name" : nameValue, ...}, key2 : {}, ...}   
     * @param object   
     * @return   
     */    
    public static String getJSONString(Object object) throws Exception{     
        String jsonString = null;     
        //日期值處理器     
        JsonConfig jsonConfig = new JsonConfig();     
        jsonConfig.registerJsonValueProcessor(java.util.Date.class, new JsonDateValueProcessor());     
        if(object != null){     
            if(object instanceof Collection || object instanceof Object[]){     
                jsonString = JSONArray.fromObject(object, jsonConfig).toString();     
            }else{     
                jsonString = JSONObject.fromObject(object, jsonConfig).toString();     
            }     
        }     
        return jsonString == null ? "{}" : jsonString;     
    }     
         
    private static void setDataFormat2JAVA(){     
        //設定日期轉換格式     
        JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss"}));     
    }     
         
    public static void main(String[] arg) throws Exception{     
        String s = "{status : 'success'}";     
        System.out.println(" object : " + JsonUtil.getJSONString(s));     
    }     
}    
  
public class JsonUtil {  
  
 /**頁面傳至后台時,json數據在request的參數名稱*/  
 public final static String JSON_ATTRIBUTE = "json";  
 public final static String JSON_ATTRIBUTE1 = "json1";  
 public final static String JSON_ATTRIBUTE2 = "json2";  
 public final static String JSON_ATTRIBUTE3 = "json3";  
 public final static String JSON_ATTRIBUTE4 = "json4";  
   
 /** 
  * 從一個JSON 對象字符格式中得到一個java對象,形如: 
  * {"id" : idValue, "name" : nameValue, "aBean" : {"aBeanId" : aBeanIdValue, ...}} 
  * @param object 
  * @param clazz 
  * @return 
  */  
 public static Object getDTO(String jsonString, Class clazz){  
  JSONObject jsonObject = null;  
  try{  
   setDataFormat2JAVA();   
   jsonObject = JSONObject.fromObject(jsonString);  
  }catch(Exception e){  
   e.printStackTrace();  
  }  
  return JSONObject.toBean(jsonObject, clazz);  
 }  
   
 /** 
  * 從一個JSON 對象字符格式中得到一個java對象,其中beansList是一類的集合,形如: 
  * {"id" : idValue, "name" : nameValue, "aBean" : {"aBeanId" : aBeanIdValue, ...}, 
  * beansList:[{}, {}, ...]} 
  * @param jsonString 
  * @param clazz 
  * @param map 集合屬性的類型 (key : 集合屬性名, value : 集合屬性類型class) eg: ("beansList" : Bean.class) 
  * @return 
  */  
 public static Object getDTO(String jsonString, Class clazz, Map map){  
  JSONObject jsonObject = null;  
  try{  
   setDataFormat2JAVA();   
   jsonObject = JSONObject.fromObject(jsonString);  
  }catch(Exception e){  
   e.printStackTrace();  
  }  
  return JSONObject.toBean(jsonObject, clazz, map);  
 }  
   
 /** 
  * 從一個JSON數組得到一個java對象數組,形如: 
  * [{"id" : idValue, "name" : nameValue}, {"id" : idValue, "name" : nameValue}, ...] 
  * @param object 
  * @param clazz 
  * @return 
  */  
 public static Object[] getDTOArray(String jsonString, Class clazz){  
  setDataFormat2JAVA();  
  JSONArray array = JSONArray.fromObject(jsonString);  
  Object[] obj = new Object[array.size()];  
  for(int i = 0; i < array.size(); i++){  
   JSONObject jsonObject = array.getJSONObject(i);  
   obj[i] = JSONObject.toBean(jsonObject, clazz);  
  }  
  return obj;  
 }  
   
 /** 
  * 從一個JSON數組得到一個java對象數組,形如: 
  * [{"id" : idValue, "name" : nameValue}, {"id" : idValue, "name" : nameValue}, ...] 
  * @param object 
  * @param clazz 
  * @param map 
  * @return 
  */  
 public static Object[] getDTOArray(String jsonString, Class clazz, Map map){  
  setDataFormat2JAVA();  
  JSONArray array = JSONArray.fromObject(jsonString);  
  Object[] obj = new Object[array.size()];  
  for(int i = 0; i < array.size(); i++){  
   JSONObject jsonObject = array.getJSONObject(i);  
   obj[i] = JSONObject.toBean(jsonObject, clazz, map);  
  }  
  return obj;  
 }  
   
 /** 
  * 從一個JSON數組得到一個java對象集合 
  * @param object 
  * @param clazz 
  * @return 
  */  
 public static List getDTOList(String jsonString, Class clazz){  
  setDataFormat2JAVA();  
  JSONArray array = JSONArray.fromObject(jsonString);  
  List list = new ArrayList();  
  for(Iterator iter = array.iterator(); iter.hasNext();){  
   JSONObject jsonObject = (JSONObject)iter.next();  
   list.add(JSONObject.toBean(jsonObject, clazz));  
  }  
  return list;  
 }  
   
 /** 
  * 從一個JSON數組得到一個java對象集合,其中對象中包含有集合屬性 
  * @param object 
  * @param clazz 
  * @param map 集合屬性的類型 
  * @return 
  */  
 public static List getDTOList(String jsonString, Class clazz, Map map){  
  setDataFormat2JAVA();  
  JSONArray array = JSONArray.fromObject(jsonString);  
  List list = new ArrayList();  
  for(Iterator iter = array.iterator(); iter.hasNext();){  
   JSONObject jsonObject = (JSONObject)iter.next();  
   list.add(JSONObject.toBean(jsonObject, clazz, map));  
  }  
  return list;  
 }  
   
 /** 
  * 從json HASH表達式中獲取一個map,該map支持嵌套功能 
  * 形如:{"id" : "johncon", "name" : "小強"} 
  * 注意commons-collections版本,必須包含org.apache.commons.collections.map.MultiKeyMap 
  * @param object 
  * @return 
  */  
 public static Map getMapFromJson(String jsonString) {  
  setDataFormat2JAVA();  
        JSONObject jsonObject = JSONObject.fromObject(jsonString);  
        Map map = new HashMap();  
        for(Iterator iter = jsonObject.keys(); iter.hasNext();){  
            String key = (String)iter.next();  
            map.put(key, jsonObject.get(key));  
        }  
        return map;  
    }  
   
 /** 
     * 從json數組中得到相應java數組 
     * json形如:["123", "456"] 
     * @param jsonString 
     * @return 
     */  
    public static Object[] getObjectArrayFromJson(String jsonString) {  
        JSONArray jsonArray = JSONArray.fromObject(jsonString);  
        return jsonArray.toArray();  
    }  
  
  
 /** 
  * 把數據對象轉換成json字符串 
  * DTO對象形如:{"id" : idValue, "name" : nameValue, ...} 
  * 數組對象形如:[{}, {}, {}, ...] 
  * map對象形如:{key1 : {"id" : idValue, "name" : nameValue, ...}, key2 : {}, ...} 
  * @param object 
  * @return 
  */  
 public static String getJSONString(Object object) throws Exception{  
  String jsonString = null;  
  //日期值處理器  
  JsonConfig jsonConfig = new JsonConfig();  
  jsonConfig.registerJsonValueProcessor(java.util.Date.class, new JsonDateValueProcessor());  
  if(object != null){  
   if(object instanceof Collection || object instanceof Object[]){  
    jsonString = JSONArray.fromObject(object, jsonConfig).toString();  
   }else{  
    jsonString = JSONObject.fromObject(object, jsonConfig).toString();  
   }  
  }  
  return jsonString == null ? "{}" : jsonString;  
 }  
   
 private static void setDataFormat2JAVA(){  
  //設定日期轉換格式  
  JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss"}));  
 }  
   
 public static void main(String[] arg) throws Exception{  
  String s = "{status : 'success'}";  
  System.out.println(" object : " + JsonUtil.getJSONString(s));  
 }  
}   
  
對於java對象轉換成json數據格式時,要對日期格式化常用格式,類:JsonDateValueProcessor  
  
Java代碼   
import java.text.SimpleDateFormat;     
import java.util.Date;     
    
import net.sf.json.JsonConfig;     
import net.sf.json.processors.JsonValueProcessor;     
    
/*   
 * @author johncon   
 * 創建日期 2008-9-10   
 * json日期值處理器   
 */    
public class JsonDateValueProcessor implements JsonValueProcessor {     
    
    private String format = "yyyy-MM-dd HH:mm:ss";     
    
    public JsonDateValueProcessor() {     
    
    }     
    
    public JsonDateValueProcessor(String format) {     
        this.format = format;     
    }     
    
    public Object processArrayValue(Object value, JsonConfig jsonConfig) {     
        return process(value, jsonConfig);     
    }     
    
    public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {     
        return process(value, jsonConfig);     
    }     
         
    private Object process( Object value, JsonConfig jsonConfig ) {     
        if (value instanceof Date) {     
            String str = new SimpleDateFormat(format).format((Date) value);     
            return str;     
        }     
        return value == null ? null : value.toString();     
    }     
    
    public String getFormat() {     
        return format;     
    }     
    
    public void setFormat(String format) {     
        this.format = format;     
    }     
    
}    
  
import java.text.SimpleDateFormat;  
import java.util.Date;  
  
import net.sf.json.JsonConfig;  
import net.sf.json.processors.JsonValueProcessor;  
  
/* 
 * @author johncon 
 * 創建日期 2008-9-10 
 * json日期值處理器 
 */  
public class JsonDateValueProcessor implements JsonValueProcessor {  
  
 private String format = "yyyy-MM-dd HH:mm:ss";  
  
 public JsonDateValueProcessor() {  
  
 }  
  
 public JsonDateValueProcessor(String format) {  
  this.format = format;  
 }  
  
 public Object processArrayValue(Object value, JsonConfig jsonConfig) {  
  return process(value, jsonConfig);  
 }  
  
 public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {  
  return process(value, jsonConfig);  
 }  
   
 private Object process( Object value, JsonConfig jsonConfig ) {  
  if (value instanceof Date) {  
   String str = new SimpleDateFormat(format).format((Date) value);  
   return str;  
  }  
  return value == null ? null : value.toString();  
 }  
  
 public String getFormat() {  
  return format;  
 }  
  
 public void setFormat(String format) {  
  this.format = format;  
 }  
  
}   
  
對於對象中有明確類型的對象屬性,可不管;但對象中有集合屬性的,由於類型不明確,所以要先明確類型:  
  
Java代碼   
String jsonString = request.getParameter("json");     
//增加對象中的集合屬性的類型以及對象元素中的對象屬性的集合屬性的類型     
Map clazzMap = new HashMap();     
//secondItems是FirstDTO里的集合屬性     
clazzMap.put("secondItems", SecondDTO.class);     
//thirdItems是SecondDTO里的集合屬性     
clazzMap.put("thirdItems", ThirdDTO.class);     
FirstDTO firstDTO = (FirstDTO)JsonUtil.getDTO(jsonString, FirstDTO.class, clazzMap);   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM