Explorar o código

优化json转换

zhou-hao %!s(int64=7) %!d(string=hai) anos
pai
achega
c9671cfa76

+ 23 - 6
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/handler/JsonArrayHandler.java

@@ -20,36 +20,53 @@ package org.hswebframework.web.dao.mybatis.handler;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.serializer.SerializerFeature;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.type.*;
+import org.springframework.util.StringUtils;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 @Alias("jsonArrayHandler")
 @MappedTypes({List.class})
 @MappedJdbcTypes({JdbcType.VARCHAR, JdbcType.CLOB})
+@Slf4j
 public class JsonArrayHandler extends BaseTypeHandler<List<Object>> {
 
+    private List<Object> parseArray(String json) {
+        if (!StringUtils.hasText(json)) {
+            return null;
+        }
+        json = json.trim();
+        if (json.startsWith("{")) {
+            return new ArrayList<>(Collections.singletonList(JSON.parseObject(json)));
+        } else if (json.startsWith("[")) {
+            return JSON.parseArray(json);
+        } else {
+            log.warn("parse json array error,maybe it's not json format: {}", json);
+        }
+        return null;
+    }
+
     @Override
     public List<Object> getResult(ResultSet rs, int columnIndex) throws SQLException {
-        String s = rs.getString(columnIndex);
-        return JSON.parseArray(s);
+        return parseArray(rs.getString(columnIndex));
     }
 
     @Override
     public List<Object> getResult(ResultSet rs, String columnName) throws SQLException {
-        String s = rs.getString(columnName);
-        return JSON.parseArray(s);
+        return parseArray(rs.getString(columnName));
     }
 
     @Override
     public List<Object> getResult(CallableStatement cs, int columnIndex) throws SQLException {
-        String s = cs.getString(columnIndex);
-        return JSON.parseArray(s);
+        return parseArray(cs.getString(columnIndex));
     }
 
     @Override

+ 24 - 8
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/handler/JsonMapHandler.java

@@ -19,37 +19,53 @@
 package org.hswebframework.web.dao.mybatis.handler;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.serializer.SerializerFeature;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.type.*;
+import org.springframework.util.StringUtils;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 @Alias("jsonMapHandler")
 @MappedTypes({Map.class})
 @MappedJdbcTypes({JdbcType.VARCHAR, JdbcType.CLOB})
+@Slf4j
 public class JsonMapHandler extends BaseTypeHandler<Map<String, Object>> {
+    private Map<String, Object> parseObject(String json) {
+        if (!StringUtils.hasText(json)) {
+            return null;
+        }
+        json = json.trim();
+        if (json.startsWith("{")) {
+            return JSON.parseObject(json);
+        } else if (json.startsWith("[")) {
+            JSONArray obj = JSON.parseArray(json);
+            log.warn("json format is array ,but result type is object!", json);
+            return obj.isEmpty() ? null : obj.getJSONObject(0);
+        } else {
+            log.warn("parse json array error,maybe it's not json format: {}", json);
+        }
+        return null;
+    }
 
     @Override
     public Map<String, Object> getResult(ResultSet rs, int columnIndex) throws SQLException {
-        String s = rs.getString(columnIndex);
-        return JSON.parseObject(s);
+        return parseObject(rs.getString(columnIndex));
     }
 
     @Override
     public Map<String, Object> getResult(ResultSet rs, String columnName) throws SQLException {
-        String s = rs.getString(columnName);
-        return JSON.parseObject(s);
+        return parseObject(rs.getString(columnName));
     }
 
     @Override
     public Map<String, Object> getResult(CallableStatement cs, int columnIndex) throws SQLException {
-        String s = cs.getString(columnIndex);
-        return JSON.parseObject(s);
+        return parseObject(cs.getString(columnIndex));
     }
 
     @Override

+ 23 - 8
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/handler/JsonSetHandler.java

@@ -20,36 +20,51 @@ package org.hswebframework.web.dao.mybatis.handler;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.serializer.SerializerFeature;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.type.*;
+import org.springframework.util.StringUtils;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
 
 @Alias("jsonSetHandler")
 @MappedTypes({Set.class})
 @MappedJdbcTypes({JdbcType.VARCHAR, JdbcType.CLOB})
+@Slf4j
 public class JsonSetHandler extends BaseTypeHandler<Set> {
 
+    @SuppressWarnings("unchecked")
+    private Set<Object> parseSet(String json) {
+        if (!StringUtils.hasText(json)) {
+            return null;
+        }
+        json = json.trim();
+        if (json.startsWith("{")) {
+            return new HashSet<>(Collections.singletonList(JSON.parseObject(json)));
+        } else if (json.startsWith("[")) {
+            return (Set) JSON.parseArray(json, Set.class);
+        } else {
+            log.warn("parse json array error,maybe it's not json format: {}", json);
+        }
+        return null;
+    }
+
     @Override
     public Set getResult(ResultSet rs, int columnIndex) throws SQLException {
-        String s = rs.getString(columnIndex);
-        return JSON.parseObject(s, Set.class);
+        return parseSet(rs.getString(columnIndex));
     }
 
     @Override
     public Set getResult(ResultSet rs, String columnName) throws SQLException {
-        String s = rs.getString(columnName);
-        return JSON.parseObject(s, Set.class);
+        return parseSet(rs.getString(columnName));
     }
 
     @Override
     public Set getResult(CallableStatement cs, int columnIndex) throws SQLException {
-        String s = cs.getString(columnIndex);
-        return JSON.parseObject(s, Set.class);
+        return parseSet(cs.getString(columnIndex));
     }
 
     @Override