package com.yc.utils;
|
|
import com.yc.action.grid.AttendEntity;
|
import com.yc.action.grid.GridUtils;
|
import org.apache.commons.lang.StringUtils;
|
|
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.Map.Entry;
|
import java.util.Set;
|
|
public class JsonUtil {
|
public static String IMGRANG="|48|48|";//图片显示大小
|
public static String IMGROWHIGHT=" Height='48' ";//图片行的行高,
|
// 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();
|
}
|
/**
|
* 检查是否是合并行
|
* ***/
|
public 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
|
* 第二种显示方式:
|
* 读取uuid从其他表直接读表里的二进制图片
|
* **/
|
public static String filterImage(boolean flg,Entry<String, Object> entry,Map<String, AttendEntity> fileType){
|
String temp=((String)entry.getValue()).replaceAll("\r\n", "<br>").replaceAll("'", "'").replaceAll(">", ">").replaceAll("<", "<");
|
|
if(flg){
|
if(temp.toLowerCase().indexOf(".gif")>0
|
||temp.toLowerCase().indexOf(".jpg")>0
|
||temp.toLowerCase().indexOf(".png")>0
|
) //第一种方式
|
return "|"+temp+JsonUtil.IMGRANG;
|
else{//第二种方式
|
if(temp!=null&&!"".equalsIgnoreCase(temp)&&temp.indexOf("getImage.do")<0
|
&&(!temp.trim().toLowerCase().startsWith("http://")&&!temp.trim().toLowerCase().startsWith("https://"))) {
|
// try{
|
// String dbid= env.get(SessionKey.DATA_BASE_ID);
|
// SpObserver.setDBtoInstance("_"+dbid);
|
// AttachmentIfc attachmentIfc= (AttachmentIfc) FactoryBean.getBean("AttachmentImpl");
|
// String[] unids=temp.split(";");
|
// if(unids.length<2){
|
// throw new ApplicationException(temp+"-数据不完整,【"+entry.getKey()+"】缺少seq值");
|
// }
|
// AttachmentEntity attachmentEntity=attachmentIfc.getAttachmentEntity(unids[0],unids[1]);
|
// if(attachmentEntity!=null){
|
// temp+=";"+attachmentEntity.getFileType();
|
// }
|
// }finally{
|
// SpObserver.setDBtoInstance();
|
// }
|
String imgs = "";
|
String[] array = temp.split(";");
|
int index = 0;
|
for (int i = 1; i < array.length; i++) {
|
if (fileType != null && fileType.get(array[0] + ";" + array[i]) != null) {
|
//处理多附件
|
String sp = "";
|
String uk = "";
|
if (index != 0) {
|
sp = ",";
|
} else {
|
uk = array[0] + ";";
|
}
|
String unid = uk + array[i] + ";" + fileType.get(array[0] + ";" + array[i]).getFileType();
|
imgs += sp + "|/getImage.do?type=0&uuid=" + unid + JsonUtil.IMGRANG;
|
index++;
|
}
|
}
|
/*if(array.length>2){
|
//表示有多个附件,是19类型,只取一个作为显示,处理多个附件放在弹出上传附件里
|
temp=array[0]+";"+array[1];
|
}
|
if(fileType!=null&&fileType.get(temp)!=null) {
|
//处理多附件
|
temp += ";" + fileType.get(temp).getFileType();
|
}*/
|
return imgs;//"|/getImage.do?type=0&uuid=" + temp + JsonUtil.IMGRANG;//+",|/getImage.do?type=0&uuid=" + temp + JsonUtil.IMGRANG;
|
}else
|
return temp;
|
}
|
}
|
return temp;
|
|
|
|
}
|
/**
|
* 检查是否为图片或文件
|
*
|
* **/
|
public static boolean CheckImage(String s,Entry<String, Object> entry){
|
if(s!=null&&s!=""){
|
String[] st=s.split(";");
|
|
for(String ss:st){
|
if(ss.equalsIgnoreCase(entry.getKey())&& entry.getValue()!=null&&!"".equals(entry.getValue())) {
|
return true;
|
}
|
|
}
|
|
}
|
return false;
|
//
|
// 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;//标记当前行是否为图片或文件,以便增加行高
|
boolean rowFlg=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()){
|
//处理18类型统计列,在这里把数据写到第一行对应列_RowNo
|
if("_rowno".equalsIgnoreCase(entry.getKey())&&!rowFlg&&page.getPos()==0){
|
map.put(entry.getKey(), page.getTbColsOut());
|
rowFlg=true;
|
}
|
if(page.getIsCp()==1){ //如果是复单操作,需要进行排除字段的操作
|
String s=page.getCp()+";doccode";//需要排除的字段
|
String[] t=s.split(";");
|
for(String st:t){
|
if(entry.getKey().equalsIgnoreCase(st)){
|
entry.setValue("");
|
break;
|
}
|
}
|
}
|
//每个字段,合并行时,不输出,跳出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(page.getPicFild(),entry);
|
sb .append(entry.getValue()==null?"":filterImage(imgflg,entry,page.getAttachmentType()));
|
}
|
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?"":((Float)entry.getValue()).floatValue());
|
}
|
else if(entry.getValue() instanceof Double){
|
if((Double)entry.getValue()==0)
|
sb.append(0);
|
else {
|
if(entry.getValue()!=null&&entry.getValue().toString().indexOf("E")>0) {
|
try {
|
|
sb.append(((BigDecimal)entry.getValue()).stripTrailingZeros().toPlainString());//stripTrailingZeros表示去掉尾数0
|
}catch (Exception e){
|
String value= new BigDecimal(entry.getValue().toString()).stripTrailingZeros().toPlainString();
|
sb.append(value);
|
}
|
}
|
else
|
sb.append(entry.getValue()==null?"":((Double)entry.getValue()).doubleValue());
|
}
|
} else if (entry.getValue() instanceof BigDecimal) {
|
if (((BigDecimal) entry.getValue()).floatValue() == 0)
|
sb.append(0.0);
|
else {
|
String value=((BigDecimal) entry.getValue()).stripTrailingZeros().toPlainString();
|
sb.append(entry.getValue() == null ? "" :value );
|
}
|
} else
|
sb.append(entry.getValue() == null ? "" : entry.getValue());
|
sb.append("' ");
|
imgflg = false;
|
//处理权限表达式为0的情况,把数据类型转换成Text
|
if (map.containsKey(entry.getKey() + "_expr") &&
|
map.get(entry.getKey() + "_expr").equals(0)) {
|
sb.append(" " + entry.getKey() + "Type='Text' ");
|
}
|
}
|
if(imgflg) sb.append(IMGROWHIGHT);
|
|
sb.append("/>");
|
}
|
return sb.toString();
|
}
|
@SuppressWarnings({"unchecked"})
|
public static String list2Xml2(Page page){
|
List list=page.getData();
|
|
Map<String, Map<String, Object>> resultMap= (Map<String, Map<String, Object>>) page.getResultMap();
|
if(list==null) return "";
|
StringBuilder sb=new StringBuilder();
|
Object str="";//保存上一次的字段值
|
int span=0;
|
boolean imgflg=false;//标记当前行是否为图片或文件,以便增加行高
|
String fieldId="";
|
for(int i=0;i<list.size();i++){
|
//每行
|
Map<String,Object> map=(Map<String,Object>)list.get(i);
|
|
sb.append("<I ");
|
//处理38类型统计列,在这里把数据写到第一行对应列_RowNo
|
if (i==0&&page.getPos()==0) {
|
sb.append("_rowno='"+ page.getTbColsOut()+"' ");
|
}
|
for(Map.Entry<String, Object> entry : map.entrySet()){
|
if(entry.getKey().equalsIgnoreCase("_rowno")) continue;
|
Map<String,Object> map2=resultMap.get(entry.getKey().toLowerCase());
|
fieldId=entry.getKey();
|
if(map2!=null) {
|
final String[] byAsOfEnd = (map2.get("fieldid") + "").toLowerCase()
|
.split("\\s*\\b(?i)as\\b\\s*");
|
if (byAsOfEnd.length > 1) {
|
fieldId = byAsOfEnd[1];
|
} else {
|
fieldId = byAsOfEnd[0];
|
}
|
}
|
if (fieldId.equalsIgnoreCase(entry.getKey())) {
|
if (page.getIsCp() == 1) { //如果是复单操作,需要进行排除字段的操作
|
String c = page.getCp() + ";doccode";//需要排除的字段
|
String[] t = c.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().toLowerCase() + "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(page.getPicFild(), entry);
|
sb.append(entry.getValue() == null ? "" : filterImage(imgflg, entry, page.getAttachmentType()));
|
} 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 ? "" :((Float) entry.getValue()).floatValue());
|
} else if (entry.getValue() instanceof Double) {
|
if ((Double) entry.getValue() == 0)
|
sb.append(0);
|
else
|
sb.append(entry.getValue() == null ? "" :((Double) entry.getValue()).doubleValue());
|
} else if (entry.getValue() instanceof BigDecimal) {
|
if (((BigDecimal) entry.getValue()).doubleValue() == 0)
|
sb.append(0);
|
else
|
{
|
String value=((BigDecimal) entry.getValue()).stripTrailingZeros().toPlainString();
|
sb.append(entry.getValue() == null ? "" :value );
|
}
|
} else
|
sb.append(entry.getValue() == null ? "" : entry.getValue());
|
sb.append("' ");
|
//处理Align
|
sb.append(entry.getKey().toLowerCase() + "Align=");
|
|
String align ="Center";
|
if(map2!=null) {
|
align= GridUtils.prossRowSetDataType_String(map2, "cellAlign");
|
}
|
if (StringUtils.isBlank(align)) {
|
sb.append("'" + "Center" + "'" + " ");
|
} else {
|
sb.append("'" + align + "'" + " ");
|
}
|
imgflg = false;
|
|
}
|
|
}
|
|
if(imgflg) sb.append(IMGROWHIGHT);
|
|
sb.append("/>");
|
}
|
return sb.toString();
|
}
|
/**
|
* 取得当前集合指定字段,跨多少行,返回形式:字段+RowSpan="3"
|
*
|
* @param k 表示树的层级数
|
**/
|
public 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 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;//不存在需要跨行则直接返回
|
for (int i = k; i < list.size(); i++) {
|
Map<String, Object> map = (Map<String, Object>) list.get(i);
|
if (value != null && value.equals(map.get(key))) {
|
index++;
|
} else {
|
break;
|
}
|
}
|
return index;
|
}
|
|
public static int getRowSpanV2(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 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;//不存在需要跨行则直接返回
|
for (int i = k; i < list.size(); i++) {
|
Map<String, Object> map = (Map<String, Object>) list.get(i);
|
if (value != null && value.equals(map.get(key))) {
|
index++;
|
}
|
}
|
return index;
|
}
|
}
|