Skip to content

Commit 32201f4

Browse files
committed
新增自动生成解析JSON的Java代码,在下载测试请求结果最后附带
1 parent df1c4a9 commit 32201f4

File tree

2 files changed

+129
-1
lines changed

2 files changed

+129
-1
lines changed

apijson/CodeUtil.js

Lines changed: 128 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,109 @@ var CodeUtil = {
165165
},
166166

167167

168+
/**解析出 生成Android-Java返回结果JSON 的代码
169+
* @param name
170+
* @param resObj
171+
* @param depth
172+
* @return parseCode
173+
*/
174+
parseJavaResponse: function(name, resObj, depth) {
175+
if (depth == null || depth < 0) {
176+
depth = 0;
177+
}
178+
179+
if (name == null || name == '') {
180+
name = 'response';
181+
}
182+
183+
return CodeUtil.parseCode(name, resObj, {
184+
185+
onParseParentStart: function () {
186+
return depth > 0 ? '' : CodeUtil.getBlank(depth) + 'JSONResponse ' + name + ' = new JSONResponse(resultJson); \n';
187+
},
188+
189+
onParseParentEnd: function () {
190+
return '';
191+
},
192+
193+
onParseChildArray: function (key, value, index) {
194+
return this.onParseChildObject(key, value, index);
195+
},
196+
197+
onParseChildObject: function (key, value, index) {
198+
return this.onParseJSONObject(key, value, index);
199+
},
200+
201+
onParseChildOther: function (key, value, index) {
202+
203+
if (value instanceof Array) {
204+
log(CodeUtil.TAG, 'parseJavaResponse for typeof value === "array" >> ' );
205+
206+
return this.onParseJSONArray(key, value, index);
207+
}
208+
if (value instanceof Object) {
209+
log(CodeUtil.TAG, 'parseJavaResponse for typeof value === "array" >> ' );
210+
211+
return this.onParseJSONObject(key, value, index);
212+
}
213+
214+
var type = CodeUtil.getJavaTypeFromJS(key, value, true);
215+
216+
return '\n' + CodeUtil.getBlank(depth) + type + ' ' + key + ' = ' + name + '.get'
217+
+ (/[A-Z]/.test(type.substring(0, 1)) ? type : StringUtil.firstCase(type + 'Value', true)) + '("' + key + '");';
218+
},
168219

220+
onParseJSONArray: function (key, value, index) {
221+
var padding = '\n' + CodeUtil.getBlank(depth);
222+
var innerPadding = padding + CodeUtil.getBlank(1);
223+
var k = JSONResponse.replaceArray(key);
224+
//还有其它字段冲突以及for循环的i冲突,解决不完的,只能让开发者自己抽出函数 var item = StringUtil.addSuffix(k, 'Item');
225+
var type = CodeUtil.getJavaTypeFromJS('item', value[0], false);
226+
227+
var s = '\n' + padding + '//' + key + '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<';
228+
229+
s += padding + 'JSONArray ' + k + ' = JSON.nullToEmpty(' + name + '.getJSONArray("' + key + '"));';
230+
231+
s += '\n' + padding + '//TODO 把这段代码抽取一个函数,以免for循环嵌套时 i 冲突 或 id等其它字段冲突';
232+
233+
s += padding + type + ' item;';
234+
235+
s += padding + 'for (int i = 0; i < ' + k + '.size(); i++) {';
236+
237+
s += innerPadding + 'item = ' + k + '.get' + type + '(i);';
238+
s += innerPadding + 'if (item == null) {';
239+
s += innerPadding + ' continue;';
240+
s += innerPadding + '}';
241+
//不能生成N个,以第0个为准,可能会不全,剩下的由开发者自己补充。 for (var i = 0; i < value.length; i ++) {
242+
if (value[0] instanceof Object) {
243+
s += CodeUtil.parseJavaResponse('item', value[0], depth + 1);
244+
}
245+
// }
246+
247+
s += padding + '}';
248+
249+
s += padding + '//' + key + '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n';
250+
251+
return s;
252+
},
253+
254+
onParseJSONObject: function (key, value, index) {
255+
var padding = '\n' + CodeUtil.getBlank(depth);
256+
var k = StringUtil.firstCase(JSONResponse.getSimpleName(key));
257+
258+
var s = '\n' + padding + '//' + key + '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<';
259+
260+
s += padding + 'JSONObject ' + k + ' = JSON.nullToEmpty(' + name + '.getJSONObject("' + key + '"));\n'
261+
262+
s += CodeUtil.parseJavaResponse(k, value, depth);
263+
264+
s += padding + '//' + key + '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n';
265+
266+
return s;
267+
}
268+
})
269+
270+
},
169271

170272

171273

@@ -418,6 +520,31 @@ var CodeUtil = {
418520
},
419521

420522

523+
getJavaTypeFromJS: function (key, value, baseFirst) {
524+
if (typeof value == 'boolean') {
525+
return baseFirst ? 'boolean' : 'Boolean';
526+
}
527+
if (typeof value == 'number') {
528+
if (String(value).indexOf(".") >= 0) {
529+
return baseFirst ? 'double' : 'Double';
530+
}
531+
if (Math.abs(value) >= 2147483647 || CodeUtil.isId(key)) {
532+
return baseFirst ? 'long' : 'Long';
533+
}
534+
return baseFirst ? 'int' : 'Integer';
535+
}
536+
if (typeof value == 'string') {
537+
return 'String';
538+
}
539+
if (value instanceof Array) {
540+
return 'JSONArray';
541+
}
542+
if (value instanceof Object) {
543+
return 'JSONObject';
544+
}
545+
546+
return 'Object';
547+
},
421548

422549
/**根据数据库类型获取Java类型
423550
* @param t
@@ -504,7 +631,7 @@ var CodeUtil = {
504631
for (var i = 0; i < arr.length; i ++) {
505632
t = typeof arr[i];
506633
if (t == 'object' || t == 'array') {
507-
throw new Error('请求JSON中 ' + (path || '""') + ':[] 格式错误!key:[] 的[]中所有元素都不能为对象{}或数组[] !');
634+
//TODO 不止为什么parseJavaResponse会调用这个函数,先放过 throw new Error('请求JSON中 ' + (path || '""') + ':[] 格式错误!key:[] 的[]中所有元素都不能为对象{}或数组[] !');
508635
}
509636
v = (t == 'string' ? '"' + arr[i] + '"': arr[i]) //只支持基本类型
510637
s += (i > 0 ? ', ' : '') + v;

js/main.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@
440440
+ '\n\nURL: ' + vUrl.value
441441
+ '\n\nRequest:\n' + vInput.value
442442
+ '\n\n\nResponse:\n' + App.jsoncon
443+
+ '\n\n\n## Java解析Response的代码 \n\n' + CodeUtil.parseJavaResponse('res', JSON.parse(App.jsoncon), 0)
443444
, App.exTxt.name + '.txt')
444445
}
445446
}

0 commit comments

Comments
 (0)