package com.yc.utils;
|
|
import java.beans.IntrospectionException;
|
import java.beans.Introspector;
|
import java.beans.PropertyDescriptor;
|
import java.math.BigDecimal;
|
import java.math.BigInteger;
|
import java.sql.Timestamp;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Set;
|
|
public class FullJsonUtil {
|
public static String IMGRANG="|32|32|";//图片显示大小
|
public static String IMGROWHIGHT=" Height='32' ";//图片行的行高,
|
// private static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
|
// . getLog(JsonUtil.class);
|
|
|
public static String object2json(Object obj) {
|
StringBuilder json = new StringBuilder();
|
if (obj == null) {
|
json.append("\"\"");
|
} else if (obj instanceof String){
|
json.append("\"").append(string2json(obj.toString())).append("\"");
|
}else if(
|
obj instanceof Integer ||
|
obj instanceof Float ||
|
obj instanceof Boolean ||
|
obj instanceof Short ||
|
obj instanceof Double ||
|
obj instanceof Long ||
|
obj instanceof BigDecimal ||
|
obj instanceof BigInteger ||
|
obj instanceof Byte) {
|
json.append(obj);
|
} else if (obj instanceof Date) {//时间格式
|
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
|
json.append("\"").append(sdf.format((Timestamp)obj)).append("\"");
|
}
|
else if (obj instanceof Object[]) {
|
json.append(array2json((Object[]) obj));
|
} else if (obj instanceof List) {
|
json.append(list2json((List<?>) obj));
|
} else if (obj instanceof Map) {
|
json.append(map2json((Map<?, ?>) obj));
|
} else if (obj instanceof Set) {
|
json.append(set2json((Set<?>) obj));
|
}else if (obj instanceof Set) {
|
json.append(set2json((Set<?>) obj));
|
} else if(obj instanceof byte[]){
|
json.append("\"\"");
|
} else{
|
json.append(bean2json(obj));
|
}
|
return json.toString();
|
}
|
|
|
public static String bean2json(Object bean) {
|
StringBuilder json = new StringBuilder();
|
json.append("{");
|
PropertyDescriptor[] props = null;
|
try {
|
props = Introspector. getBeanInfo(bean. getClass(), Object.class). getPropertyDescriptors();
|
} catch (IntrospectionException e) {}
|
if (props != null) {
|
for (int i = 0; i < props.length; i++) {
|
try {
|
String name = object2json(props[i]. getName());
|
String value = object2json(props[i]. getReadMethod().invoke(bean));
|
json.append(name);
|
json.append(":");
|
json.append(value);
|
json.append(",");
|
} catch (Exception e) {}
|
}
|
json.setCharAt(json.length() - 1, '}');
|
} else {
|
json.append("}");
|
}
|
return json.toString();
|
}
|
|
|
public static String list2json(List<?> list) {
|
StringBuilder json = new StringBuilder();
|
json.append("[");
|
if (list != null && list.size() > 0) {
|
for (Object obj : list) {
|
json.append(object2json(obj));
|
json.append(",");
|
}
|
json.setCharAt(json.length() - 1, ']');
|
} else {
|
json.append("]");
|
}
|
return json.toString();
|
}
|
|
|
public static String array2json(Object[] array) {
|
StringBuilder json = new StringBuilder();
|
json.append("[");
|
if (array != null && array.length > 0) {
|
for (Object obj : array) {
|
json.append(object2json(obj));
|
json.append(",");
|
}
|
json.setCharAt(json.length() - 1, ']');
|
} else {
|
json.append("]");
|
}
|
return json.toString();
|
}
|
|
|
public static String map2json(Map<?, ?> map) {
|
StringBuilder json = new StringBuilder();
|
json.append("{");
|
if (map != null && map.size() > 0) {
|
for (Object key : map.keySet()) {
|
json.append("\""+key+"\"");
|
json.append(":");
|
json.append(object2json(map. get(key)));
|
json.append(",");
|
}
|
json.setCharAt(json.length() - 1, '}');
|
} else {
|
json.append("}");
|
}
|
return json.toString();
|
}
|
|
public static String set2json(Set<?> set) {
|
StringBuilder json = new StringBuilder();
|
json.append("[");
|
if (set != null && set.size() > 0) {
|
for (Object obj : set) {
|
json.append(object2json(obj));
|
json.append(",");
|
}
|
json.setCharAt(json.length() - 1, ']');
|
} else {
|
json.append("]");
|
}
|
return json.toString();
|
}
|
|
|
public static String string2json(String s) {
|
if (s == null)
|
return "";
|
StringBuilder sb = new StringBuilder();
|
for (int i = 0; i < s.length(); i++) {
|
char ch = s.charAt(i);
|
switch (ch) {
|
case '"':
|
sb.append("\\\"");
|
break;
|
case '\\':
|
sb.append("\\\\");
|
break;
|
case '\b':
|
sb.append("\\b");
|
break;
|
case '\f':
|
sb.append("\\f");
|
break;
|
case '\n':
|
sb.append("\\n");
|
break;
|
case '\r':
|
sb.append("\\r");
|
break;
|
case '\t':
|
sb.append("\\t");
|
break;
|
// case '<':
|
// sb.append("<");
|
// break;
|
// case '>':
|
// sb.append(">");
|
// break;
|
// case '/':
|
// sb.append("\\/");
|
// break;
|
default:
|
if (ch >= '\u0000' && ch <= '\u001F') {
|
String ss = Integer.toHexString(ch);
|
sb.append("\\u");
|
for (int k = 0; k < 4 - ss.length(); k++) {
|
sb.append('0');
|
}
|
sb.append(ss.toUpperCase());
|
} else {
|
sb.append(ch);
|
}
|
}
|
}
|
return sb.toString();
|
}
|
/**
|
* 检查是否是合并行
|
* ***/
|
private static boolean checkRowSpan(String key,String rowspan){
|
if(rowspan==null||rowspan.length()==0) return false;
|
return rowspan.indexOf(key)>-1?true:false;
|
}
|
/**
|
* 处理图片的URL,转换成格线专用格式: /images/aa.jpg-->|/imags/aa.jpg|100|100
|
*
|
* **/
|
private static String filterImage(Object str){
|
String temp=((String)str).replaceAll("'", "'").replaceAll(">", ">").replaceAll("<", "<");
|
if(temp.toLowerCase().indexOf(".gif")>0
|
||temp.toLowerCase().indexOf(".jpg")>0
|
||temp.toLowerCase().indexOf(".png")>0
|
)
|
return "|"+temp+JsonUtil.IMGRANG;
|
else
|
return temp;
|
}
|
/**
|
* 检查是否为图片或文件
|
*
|
* **/
|
private static boolean CheckImage(Object str){
|
String temp=((String)str).replaceAll("'", "'").replaceAll(">", ">").replaceAll("<", "<");
|
if(temp.toLowerCase().indexOf(".gif")>0
|
||temp.toLowerCase().indexOf(".jpg")>0
|
||temp.toLowerCase().indexOf(".png")>0
|
|| temp.matches(".*?"+JsonUtil.IMGRANG.replaceAll("\\|", "\\\\|")+"+?"))
|
return true;
|
else
|
return false;
|
}
|
@SuppressWarnings({"unchecked"})
|
public static String list2Xml(Page page){
|
List list=page.getData();
|
if(list==null) return "";
|
StringBuilder sb=new StringBuilder();
|
Object str="";//保存上一次的字段值
|
int span=0;
|
boolean imgflg=false;//标记当前行是否为图片或文件,以便增加行高
|
for(int i=0;i<list.size();i++){
|
//每行
|
Map<String,Object> map=(Map<String,Object>)list.get(i);
|
sb.append("<I ");
|
|
for(Map.Entry<String, Object> entry : map.entrySet()){
|
|
if(page.getIsCp()==1){ //如果是复单操作,需要进行排除字段的操作
|
String s=page.getCp()+";doccode";//需要排除的字段
|
String[] t=s.split(";");
|
for(String st:t){
|
if(entry.getKey().equalsIgnoreCase(st)) entry.setValue("");
|
}
|
// map.put("Added", "1");
|
}
|
//每个字段,合并行时,不输出,跳出for
|
//第一次
|
if(checkRowSpan(entry.getKey(),page.getRowSpan())&&str!=null&&str.equals(entry.getValue())){//表示当前字段还在跨行中,跳出来
|
continue;
|
}
|
//取得跨行数
|
span=getRowSpan(list,entry,page.getRowSpan(),i);
|
if(span>1){//跨二行或以上时,输出
|
if(!str.equals(entry.getValue()))
|
str=entry.getValue();
|
sb.append(entry.getKey()+"RowSpan='"+span+"' ");
|
}else{
|
span=0;
|
}
|
|
sb
|
.append((("id".equalsIgnoreCase(entry.getKey())&&page.getIsGantt()==0)?"_ycid_":entry.getKey()).toLowerCase())//增加对字段id转为treegrid的_ycid_
|
.append("='");
|
if(entry.getValue() instanceof String){
|
if(!imgflg) imgflg=CheckImage(entry.getValue());
|
sb .append(entry.getValue()==null?"":filterImage(entry.getValue()));
|
}
|
else if(entry.getValue() instanceof Integer){
|
if((Integer)entry.getValue()==0)
|
sb.append(0);
|
else
|
sb.append(entry.getValue()==null?"":entry.getValue());
|
}
|
else if(entry.getValue() instanceof Float){
|
if((Float)entry.getValue()==0)
|
sb.append(0);
|
else
|
sb.append(entry.getValue()==null?"":entry.getValue());
|
}
|
else if(entry.getValue() instanceof Double){
|
if((Double)entry.getValue()==0)
|
sb.append(0);
|
else
|
sb.append(entry.getValue()==null?"":entry.getValue());
|
}
|
else if(entry.getValue() instanceof BigDecimal){
|
if(((BigDecimal)entry.getValue()).floatValue()==0)
|
sb.append(0);
|
else
|
sb.append(entry.getValue()==null?"":entry.getValue());
|
}
|
else
|
sb.append(entry.getValue()==null?"":entry.getValue());
|
sb .append("' ");
|
|
|
}
|
if(imgflg) sb.append(IMGROWHIGHT);
|
sb.append("/>");
|
}
|
return sb.toString();
|
}
|
/**
|
* 取得当前集合指定字段,跨多少行,返回形式:字段+RowSpan="3"
|
* **/
|
private static int getRowSpan(List list,Map.Entry<String, Object> en,String row,int k){
|
|
int index=0;
|
if(row==null||row=="null") return 0;
|
String[] temp=row.split(";");
|
//String
|
String key=en.getKey();
|
Object value=en.getValue();
|
boolean bol=false;
|
for(String s:temp){
|
if( s.equalsIgnoreCase(key)){
|
bol=true;
|
break;
|
}
|
}
|
if(!bol) return 0;//不存在需要跨行则直接返回
|
boolean flg=false;
|
for(int i=k;i<list.size();i++){
|
Map<String,Object> map=(Map<String,Object>)list.get(i);
|
for(Map.Entry<String, Object> entry : map.entrySet()){
|
|
|
if(key.equalsIgnoreCase(entry.getKey())){//当前字段需要合并,且是所指定的字段
|
//根据当前数据,相同值都需要合并成一行显示
|
if(value!=null&&value.equals(entry.getValue())){//相同值
|
index++;
|
break;
|
}else{
|
flg=true;
|
break;
|
}
|
}
|
}
|
if(flg) break;
|
}
|
return index;
|
}
|
}
|