@@ -165,7 +165,109 @@ var CodeUtil = {
165
165
} ,
166
166
167
167
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
+ } ,
168
219
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
+ } ,
169
271
170
272
171
273
@@ -418,6 +520,31 @@ var CodeUtil = {
418
520
} ,
419
521
420
522
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
+ } ,
421
548
422
549
/**根据数据库类型获取Java类型
423
550
* @param t
@@ -504,7 +631,7 @@ var CodeUtil = {
504
631
for ( var i = 0 ; i < arr . length ; i ++ ) {
505
632
t = typeof arr [ i ] ;
506
633
if ( t == 'object' || t == 'array' ) {
507
- throw new Error ( '请求JSON中 ' + ( path || '""' ) + ':[] 格式错误!key:[] 的[]中所有元素都不能为对象{}或数组[] !' ) ;
634
+ //TODO 不止为什么parseJavaResponse会调用这个函数,先放过 throw new Error('请求JSON中 ' + (path || '""') + ':[] 格式错误!key:[] 的[]中所有元素都不能为对象{}或数组[] !');
508
635
}
509
636
v = ( t == 'string' ? '"' + arr [ i ] + '"' : arr [ i ] ) //只支持基本类型
510
637
s += ( i > 0 ? ', ' : '' ) + v ;
0 commit comments