Procházet zdrojové kódy

优化解析JSON结构的性能

jmxd před 2 roky
rodič
revize
d6c587d6cd

+ 34 - 35
src/scripts/parsing/parser.js

@@ -1,5 +1,4 @@
-import { ParseException, Span, TokenStream, TokenType } from './index.js'
-import tokenizer from './tokenizer.js'
+import { ParseException, Span, TokenType } from './index.js'
 import JavaClass from '../editor/java-class.js'
 import {
 	Assert,
@@ -931,10 +930,24 @@ function processBody(body, srcObj) {
 		defaultValue: null,
 		children: [],
 	}
-	if (body instanceof MapLiteral) {
-		body.keys.forEach((key, index) => {
-			const name = key.span.getText().replace(/['"]/g, '');
-			let value = body.values[index];
+	if (Array.isArray(body)) {
+		if (body[0] !== undefined) {
+			let value = body[0]
+			const simpleObject = isSimpleObject(value)
+			let param = {
+				...defaultParam,
+				value:  simpleObject ? value + '' : '',
+				dataType: srcObj['']?.dataType || getType(value),
+			}
+			if (!simpleObject) {
+				param.children = processBody(value, objToMap(srcObj['']));
+			}
+			arr.push(param)
+		}
+	} else {
+		Object.keys(body).forEach(name => {
+			const value = body[name];
+			const simpleObject = isSimpleObject(value)
 			let param = {
 				...defaultParam,
 				description: srcObj[name]?.description || '',
@@ -944,58 +957,44 @@ function processBody(body, srcObj) {
 				error: srcObj[name]?.error || '',
 				name,
 				defaultValue: srcObj[name]?.defaultValue,
-				value: isSimpleObject(value) ? value.span.getText().trim() : '',
+				value: simpleObject ? value + '' : '',
 				dataType: getType(value),
 			}
-			if (value instanceof MapLiteral || value instanceof ListLiteral) {
+			if (!simpleObject) {
 				param.children = processBody(value, objToMap(srcObj[name]));
 			}
 			arr.push(param)
 		});
-	} else if (body instanceof ListLiteral) {
-		if (body.values[0]) {
-			let value = body.values[0]
-			let param = {
-				...defaultParam,
-				value: isSimpleObject(value) ? value.span.getText().trim() : '',
-				dataType: srcObj['']?.dataType || getType(value),
-			}
-			if (value instanceof MapLiteral || value instanceof ListLiteral) {
-				param.children = processBody(value, objToMap(srcObj['']));
-			}
-			arr.push(param)
-		}
 	}
 	return arr;
 }
 
 function isSimpleObject(object) {
-	return !(object instanceof MapLiteral || object instanceof ListLiteral)
+	return !(object != null && typeof object === 'object')
 }
 
 function getType(object) {
-	if (object instanceof MapLiteral) {
-		return "Object";
-	}
-	if (object instanceof ListLiteral) {
+	if (Array.isArray(object)) {
 		return "Array";
 	}
-	if (object instanceof UnaryOperation) {
-		object = object.operand;
+	const typeStr = typeof object;
+	if (typeStr === 'object') {
+		return "Object";
 	}
-	let type = object.javaType.substring(object.javaType.lastIndexOf(".") + 1);
-	if (type === 'Integer' && Number(object.span.getText()) > 0x7fffffff || Number(object.span.getText()) < -0x80000000) {
-		return 'Long'
+	if (typeStr === 'number') {
+		if (object > 0x7fffffff || object < -0x80000000) {
+			return 'Long'
+		}
+		return 'Integer'
 	}
-	return type === 'null' ? 'Object' : type;
+	
+	return typeStr === 'boolean' ? 'Boolean' : 'String';
 }
 
 export function parseJson(bodyStr, srcObj) {
 	srcObj = srcObj || {}
 	try {
-		JSON.parse(bodyStr)
-		let parser = new Parser(new TokenStream(tokenizer(bodyStr)))
-		let expr = parser.parseExpression();
+		const expr = JSON.parse(bodyStr)
 		return {
 			name: '',
 			value: '',

+ 1 - 1
src/scripts/parsing/tokenizer.js

@@ -126,7 +126,7 @@ const autoNumberType = (span, radix) => {
 	if (value > 0x7fffffff || value < -0x80000000) {
 		return new LiteralToken(TokenType.LongLiteral, span, value);
 	} else if (value > 127 || value < -128) {
-		return new LiteralToken(TokenType.LongLiteral, span, value);
+		return new LiteralToken(TokenType.IntegerLiteral, span, value);
 	}
 	return new LiteralToken(TokenType.ByteLiteral, span, value);
 }

+ 3 - 4
src/scripts/service/magic-api.js

@@ -4,7 +4,7 @@ import request from '../request.js'
 import bus from '../bus.js'
 import $i from '../i18n.js'
 import modal from '../../components/common/dialog/magic-modal.js'
-import { definition2TreeList, getSizeUnit, formatJson, structureHasChanged } from '../utils.js'
+import { definition2TreeList, getSizeUnit, structureHasChanged } from '../utils.js'
 import { parseJson } from '../parsing/parser.js'
 import { nextTick } from 'vue'
 function sendApiTestRequest(opened, requestConfig) {
@@ -27,8 +27,7 @@ function sendApiTestRequest(opened, requestConfig) {
 			reader.readAsText(data)
 			reader.onload = function () {
 				try {
-					JSON.parse(this.result)
-					resolve(this.result)
+					resolve(JSON.stringify(JSON.parse(this.result), null, 4))
 				} catch (e) {
 					resolve(data)
 				}
@@ -47,7 +46,7 @@ function sendApiTestRequest(opened, requestConfig) {
 			opened.item.responseBodyDefinition = null
 			opened.responseBodyTree = null
 		} else {
-			opened.item.responseBody = formatJson(data)
+			opened.item.responseBody = data
 			let definition = parseJson(opened.item.responseBody, opened.item.responseBodyDefinition)
 			if(structureHasChanged(opened.item.responseBodyDefinition, definition)){
 				bus.$emit(Message.NOTIFY, {