@@ -336,39 +336,45 @@ private static String findLatestVersionName(String response) {
336336 }
337337
338338 String lastObject = response .substring (lastObjectStart , lastObjectEnd );
339- int objectDepth = 0 ;
340- for (int index = 0 ; index < lastObject .length (); index ++) {
341- char character = lastObject .charAt (index );
342- if (character == '"' ) {
343- int stringEnd = findStringEnd (lastObject , index + 1 );
344- if (stringEnd == -1 ) {
339+ for (int index = 1 ; index < lastObject .length () - 1 ; ) {
340+ index = skipWhitespace (lastObject , index );
341+ if (index >= lastObject .length () - 1 ) {
342+ break ;
343+ }
344+ if (lastObject .charAt (index ) == ',' ) {
345+ index ++;
346+ continue ;
347+ }
348+ if (lastObject .charAt (index ) != '"' ) {
349+ return null ;
350+ }
351+
352+ int keyEnd = findStringEnd (lastObject , index + 1 );
353+ if (keyEnd == -1 ) {
354+ return null ;
355+ }
356+ String key = lastObject .substring (index + 1 , keyEnd );
357+ int colonIndex = skipWhitespace (lastObject , keyEnd + 1 );
358+ if (colonIndex >= lastObject .length () || lastObject .charAt (colonIndex ) != ':' ) {
359+ return null ;
360+ }
361+ int valueStart = skipWhitespace (lastObject , colonIndex + 1 );
362+ if ("name" .equals (key )) {
363+ if (valueStart >= lastObject .length () || lastObject .charAt (valueStart ) != '"' ) {
345364 return null ;
346365 }
347- if (objectDepth == 1 ) {
348- String key = lastObject .substring (index + 1 , stringEnd );
349- int colonIndex = skipWhitespace (lastObject , stringEnd + 1 );
350- if (colonIndex < lastObject .length () && lastObject .charAt (colonIndex ) == ':' ) {
351- int valueStart = skipWhitespace (lastObject , colonIndex + 1 );
352- if ("name" .equals (key ) && valueStart < lastObject .length () && lastObject .charAt (valueStart ) == '"' ) {
353- int valueEnd = findStringEnd (lastObject , valueStart + 1 );
354- if (valueEnd == -1 ) {
355- return null ;
356- }
357- return lastObject .substring (valueStart + 1 , valueEnd );
358- }
359- }
366+ int valueEnd = findStringEnd (lastObject , valueStart + 1 );
367+ if (valueEnd == -1 ) {
368+ return null ;
360369 }
361- index = stringEnd ;
362- continue ;
363- }
364- if (character == '{' ) {
365- objectDepth ++;
366- continue ;
370+ return lastObject .substring (valueStart + 1 , valueEnd );
367371 }
368- if (character == '}' ) {
369- objectDepth --;
370- continue ;
372+
373+ int valueEnd = skipJsonValue (lastObject , valueStart );
374+ if (valueEnd == -1 ) {
375+ return null ;
371376 }
377+ index = valueEnd + 1 ;
372378 }
373379 return null ;
374380 }
@@ -396,4 +402,58 @@ private static int skipWhitespace(String input, int startIndex) {
396402 return index ;
397403 }
398404
405+ private static int skipJsonValue (String input , int startIndex ) {
406+ if (startIndex >= input .length ()) {
407+ return -1 ;
408+ }
409+ char character = input .charAt (startIndex );
410+ if (character == '"' ) {
411+ return findStringEnd (input , startIndex + 1 );
412+ }
413+ if (character == '{' || character == '[' ) {
414+ char open = character ;
415+ char close = character == '{' ? '}' : ']' ;
416+ int depth = 1 ;
417+ boolean inString = false ;
418+ boolean escaping = false ;
419+ for (int index = startIndex + 1 ; index < input .length (); index ++) {
420+ char current = input .charAt (index );
421+ if (escaping ) {
422+ escaping = false ;
423+ continue ;
424+ }
425+ if (inString ) {
426+ if (current == '\\' ) {
427+ escaping = true ;
428+ } else if (current == '"' ) {
429+ inString = false ;
430+ }
431+ continue ;
432+ }
433+ if (current == '"' ) {
434+ inString = true ;
435+ continue ;
436+ }
437+ if (current == open ) {
438+ depth ++;
439+ } else if (current == close ) {
440+ depth --;
441+ if (depth == 0 ) {
442+ return index ;
443+ }
444+ }
445+ }
446+ return -1 ;
447+ }
448+ int index = startIndex ;
449+ while (index < input .length ()) {
450+ char current = input .charAt (index );
451+ if (current == ',' || current == '}' ) {
452+ return index - 1 ;
453+ }
454+ index ++;
455+ }
456+ return input .length () - 1 ;
457+ }
458+
399459}
0 commit comments