Procházet zdrojové kódy

解决消息队列中消息含有反斜杠,导致无法解析成json的问题

sunyj před 8 roky
rodič
revize
7ca306780b

+ 0 - 93
search-console-b2b/src/main/java/com/uas/search/console/b2b/core/util/FastjsonUtils.java

@@ -1,93 +0,0 @@
-package com.uas.search.console.b2b.core.util;
-
-import java.util.List;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.parser.Feature;
-import com.alibaba.fastjson.serializer.SerializerFeature;
-
-/**
- * @author yingp
- * @see JSON
- *
- */
-public class FastjsonUtils {
-
-	public static Feature DEFAULT_PARSER_FEATURE = Feature.DisableCircularReferenceDetect;
-	public static SerializerFeature DEFAULT_SERIAL_FEATURE = SerializerFeature.DisableCircularReferenceDetect;
-
-	/**
-	 * 把JSON文本parse为JSONObject或者JSONArray
-	 * 
-	 * @param text
-	 * @return
-	 */
-	public static Object parse(String text) {
-		return JSON.parse(text, DEFAULT_PARSER_FEATURE);
-	}
-
-	/**
-	 * 把JSON文本parse成JSONObject
-	 * 
-	 * @param text
-	 * @return
-	 */
-	public static final JSONObject parseObject(String text) {
-		return JSON.parseObject(text, DEFAULT_PARSER_FEATURE);
-	}
-
-	/**
-	 * 把JSON文本parse为JavaBean
-	 * 
-	 * @param text
-	 * @param clazz
-	 * @return
-	 */
-	public static final <T> T fromJson(String text, Class<T> clazz) {
-		return JSON.parseObject(text, clazz, DEFAULT_PARSER_FEATURE);
-	}
-
-	/**
-	 * 把JSON文本parse成JSONArray
-	 * 
-	 * @param text
-	 * @return
-	 */
-	public static final JSONArray fromJsonArray(String text) {
-		return JSON.parseArray(text);
-	}
-
-	/**
-	 * 把JSON文本parse成JavaBean集合
-	 * 
-	 * @param text
-	 * @param clazz
-	 * @return
-	 */
-	public static final <T> List<T> fromJsonArray(String text, Class<T> clazz) {
-		return JSON.parseArray(text, clazz);
-	}
-
-	/**
-	 * 将JavaBean序列化为JSON文本
-	 * 
-	 * @param object
-	 * @return
-	 */
-	public static final String toJson(Object object) {
-		return JSON.toJSONString(object, DEFAULT_SERIAL_FEATURE);
-	}
-
-	/**
-	 * 将JavaBean转换为JSONObject或者JSONArray。
-	 * 
-	 * @param javaObject
-	 * @return
-	 */
-	public static final Object toJSON(Object javaObject) {
-		return JSON.toJSON(javaObject);
-	}
-
-}

+ 3 - 2
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneQueueMessageDao.java

@@ -17,6 +17,7 @@ import org.slf4j.LoggerFactory;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.search.b2b.exception.SearchException;
 import com.uas.search.b2b.model.SPage;
+import com.uas.search.console.b2b.util.JSONUtils;
 import com.uas.search.console.b2b.util.SearchConstants;
 
 import oracle.sql.STRUCT;
@@ -127,10 +128,10 @@ public class LuceneQueueMessageDao {
 				Object[] attributes = userData.getAttributes();
 				// 自定义消息格式 {"method":"value1","table":"value2","ids":"[1,2,3]"}
 				// 从队列消息中获取表的改动信息
-				JSONObject jsonObject = JSONObject.parseObject(attributes[0].toString());
+				JSONObject jsonObject = JSONUtils.parseObject(attributes[0].toString());
 				luceneQueueMessage.setTableName(jsonObject.getString("table"));
 				luceneQueueMessage.setIds(jsonObject.getString("ids"));
-				luceneQueueMessage.setData(jsonObject.getString("data"));
+				luceneQueueMessage.setData(JSONUtils.reverseFormat(jsonObject.getString("data")));
 				luceneQueueMessage.setMethod(jsonObject.getString("method"));
 				luceneQueueMessages.add(luceneQueueMessage);
 			}

+ 2 - 1
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/QueueMessageParser.java

@@ -16,6 +16,7 @@ import com.uas.search.b2b.exception.SearchException;
 import com.uas.search.b2b.service.SearchService.Table_name;
 import com.uas.search.console.b2b.model.ParsedQueueMessage;
 import com.uas.search.console.b2b.util.ClassAndTableNameUtils;
+import com.uas.search.console.b2b.util.JSONUtils;
 
 /**
  * 对得到的队列消息进行解析的工具
@@ -41,7 +42,7 @@ public class QueueMessageParser {
 		if (StringUtils.isEmpty(message) || message.equals("{}")) {
 			return null;
 		}
-		JSONObject jsonObject = JSONObject.parseObject(message);
+		JSONObject jsonObject = JSONUtils.parseObject(message);
 		if (!jsonObject.containsKey("method") || !jsonObject.containsKey("table")) {
 			return null;
 		}

+ 3 - 5
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/IndexServiceImpl.java

@@ -506,11 +506,9 @@ public class IndexServiceImpl implements IndexService {
 		if (StringUtils.isEmpty(tableName) || StringUtils.isEmpty(data) || StringUtils.isEmpty(method)) {
 			throw new SearchException("参数不能为空:tableName,data,method");
 		}
-		Map<String, Object> map = new HashMap<>();
-		map.put("table", tableName);
-		map.put("data", data);
-		map.put("method", method);
-		ParsedQueueMessage parsedQueueMessage = queueMessageParser.parse(JSONObject.toJSONString(map));
+		// data为json格式数据,并非简单的一个字符串,通过JSONObject构造,双引号、左括号等会被特殊处理
+		String message = "{\"table\":\"" + tableName + "\", \"data\":" + data + ", \"method\":\"" + method + "\"}";
+		ParsedQueueMessage parsedQueueMessage = queueMessageParser.parse(message);
 
 		if (parsedQueueMessage == null) {
 			logger.error("message parsing failed!");

+ 36 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/util/JSONUtils.java

@@ -0,0 +1,36 @@
+package com.uas.search.console.b2b.util;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * @author sunyj
+ * @since 2017年6月28日 下午2:42:33
+ */
+public class JSONUtils {
+
+	public static JSONObject parseObject(String text) {
+		return JSONObject.parseObject(format(text));
+	}
+
+	public static JSONArray parseArray(String text) {
+		return JSONObject.parseArray(format(text));
+	}
+
+	private static String format(String text) {
+		// 单个转义符替换为多个转义符
+		if (text == null) {
+			return null;
+		}
+		return text.replace("\\", "\\\\");
+	}
+
+	public static String reverseFormat(String text) {
+		// 多个转义符替换为单个转义符
+		if (text == null) {
+			return null;
+		}
+		return text.replace("\\\\", "\\");
+	}
+
+}