2016-02-26 2 views
1

У меня есть JSON строка структурирована следующим образом, и это бросает исключение передачи его в JSONArray timeJSONArray = new JSONArray(time);JSONArray не может быть преобразован в исключение JSONObject

Это ошибка Value [{"daysByte":158,"from":1020,"to":1260},{"daysByte":96,"from":1020,"to":1320}] at 0 of type org.json.JSONArray cannot be converted to JSONObject Это, как я получаю массив, и я не могу измените его, так что мне не удается преобразовать его в объект JSON вместо строки JSON, которая является форматом, в котором он сейчас находится. Что я делаю неправильно?

[ 
    [ 
     { 
     "daysByte":30, 
     "from":660, 
     "to":1290 
     }, 
     { 
     "daysByte":96, 
     "from":660, 
     "to":1320 
     }, 
     { 
     "daysByte":128, 
     "from":1050, 
     "to":1290 
     } 
    ], 
    [ 
     { 
     "daysByte":252, 
     "from":690, 
     "to":840 
     }, 
     { 
     "daysByte":252, 
     "from":1050, 
     "to":1260 
     } 
    ] 
] 

Это код, с которым я работаю. Я получаю значение, переданное в виде строки

public ArrayList<String> getTimeList(String time){ 

     System.out.println("PLACES ACTIVITY " + time); 
     ArrayList<String> times = new ArrayList<>(); 
     try{ 
      //JSONObject timeJSONObject = new JSONObject(time); 
      JSONArray timeJSONArray = new JSONArray(time); 
      ArrayList<LegacyTimeSpan> timeSpanList = new ArrayList<>(); 

      LegacyTimeSpanConverterImpl converter = new LegacyTimeSpanConverterImpl(); 


      for(int i = 0; i < timeJSONArray.length(); i++){ 

       int daysByte = timeJSONArray.getJSONObject(i).getInt("daysByte"); 
       int from = timeJSONArray.getJSONObject(i).getInt("from"); 
       int to = timeJSONArray.getJSONObject(i).getInt("to"); 

       System.out.println("TO " + to); 

       LegacyTimeSpan timeSpan = new LegacyTimeSpan(daysByte, from, to); 
       timeSpanList.add(timeSpan); 

      } 

      Log.d("Time span list", timeSpanList.toString()); 
      WeekSpan weekSpan = converter.convertToWeekSpan(timeSpanList); 
      List<DayTimeSpanPair> dayTimeSpanPair = weekSpan.toDayTimeSpanPairs(); 
      for(int i = 0; i< dayTimeSpanPair.size(); i++){ 

       String timeRange = buildTimeString(dayTimeSpanPair.get(i)); 
       times.add(timeRange); 


      } 
     } catch(JSONException e){ 
      Log.d("PLACES EXCEPTION JSON",e.getMessage()); 
     } 

     return times; 
    } 
+2

Не просто показать JSON, покажите код. Всегда показывайте код. –

+0

См. Мой ответ на вышеупомянутую проблему, в основном там два массива один внутри другого, следовательно, вам нужно рассмотреть массивы. В настоящее время вы пытаетесь поместить первый массив в JSONObject, который не является правильным. –

+0

'timeJSONArray.getJSONObject (i)'? У вас нет JsonObject в 'i', у вас есть массив –

ответ

0

У вас есть два массива, один массив внутри другого.

Вы должны сделать так:

for(JSONArray temp: timeJsonArray) 
{ 
    // try to convert to json object 
} 
+0

Если ошибка вызывается в этой строке' JSONArray timeJSONArray = new JSONArray (time); 'тогда как я смогу сделать цикл for после него? – Rafa

+0

@ ralphie9224 у вас пытались напечатать значение времени? –

+0

Да, это формат JSON в вопросе. – Rafa

0

В принципе, есть два JSON массива, но вы получаете доступ только один массив, а потому, что ошибка показано

try { 
     JSONArray jsonArray = new JSONArray(a); 

     for (int j=0;j<jsonArray.length();j++) { 

      JSONArray timeJSONArray = jsonArray.getJSONArray(j); 

      for(int i = 0; i < timeJSONArray.length(); i++){ 

       int daysByte = timeJSONArray.getJSONObject(i).getInt("daysByte"); 
       int from = timeJSONArray.getJSONObject(i).getInt("from"); 
       int to = timeJSONArray.getJSONObject(i).getInt("to"); 

       System.out.println("TO " + to); 


      } 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
+0

Как это исправить? – Rafa

+0

Это единственный массив. Пожалуйста, проверь это. –

+0

@chandankumarkushwaha его два массива см. Это: http://stackoverflow.com/a/2414332/5188230 –

1

Этот код должен работать, я думаю, как и объявить json Format.

   [ 
       [ 
        { 
        } ,{},{}    // Json Object Structure as u defined in you Question 
topArray =  ], 
       [ 
        { 
        },{},{} 
       ] 
      ] 


for(JSONArray objArray : topArray){ 
    for(JSONObject eachObject : objArray){ 
    System.out.println(eachObject.get("daysByte");); 
    System.out.println(eachObject.get("from"); 
    System.out.println(eachObject.get("to"); 
    } 
} 
1

Привет следующий код работает для JSON я пытался. Это специфично для вашего json не общего. поэтому, если вы хотите, вы можете использовать его.

try{ 
    JSONArray jsonArray = new JSONArray(data); //insted "Data" pass your json Strint 
     for(int i=0 ; i<jsonArray.length() ; i++){ 
      JSONArray internalArray = jsonArray.getJSONArray(i); 
      for(int j = 0 ; j < internalArray.length() ; j++){ 
       JSONObject internalObject = internalArray.getJSONObject(j); 
       Log.d("data" , internalObject.getString("daysByte")); 
       Log.d("data" , internalObject.getString("from")); 
       Log.d("data" , internalObject.getString("to")); 
      } 
     } 

    }catch(Exception e){ 
     Log.d("data" ,"Error"); 
    } 
} 
+0

Если вы считаете это полезным, пожалуйста, отметьте его как ответ –

+0

Он не пройдет мимо первой линии. Вот где он выдает исключение, поэтому после него не запускается код. – Rafa

+0

Я не получил ваш комментарий, пожалуйста, объясните свою проблему еще раз. –

0

Это 2D массив.

System.out.println("days"); 
String content = new Scanner(new File("C:/day.txt")).useDelimiter("\\Z").next(); 
Day[][] customDayWrap = new Gson().fromJson(content, Day[][].class); 
    for (Day[] days : customDayWrap) { 
     for (Day day : days) { 
      System.out.println(day.getDaysByte()); 
      System.out.println(day.getFrom()); 
      System.out.println(day.getTo()); 
     } 
    } 

И ваш класс Day будет чем-то вроде этого.

public class Day { 

@SerializedName("daysByte") 
@Expose 
private Integer daysByte; 
@SerializedName("from") 
@Expose 
private Integer from; 
@SerializedName("to") 
@Expose 
private Integer to; 

/** 
* 
* @return 
*  The daysByte 
*/ 
public Integer getDaysByte() { 
    return daysByte; 
} 

/** 
* 
* @param daysByte 
*  The daysByte 
*/ 
public void setDaysByte(Integer daysByte) { 
    this.daysByte = daysByte; 
} 

/** 
* 
* @return 
*  The from 
*/ 
public Integer getFrom() { 
    return from; 
} 

/** 
* 
* @param from 
*  The from 
*/ 
public void setFrom(Integer from) { 
    this.from = from; 
} 

/** 
* 
* @return 
*  The to 
*/ 
public Integer getTo() { 
    return to; 
} 

/** 
* 
* @param to 
*  The to 
*/ 
public void setTo(Integer to) { 
    this.to = to; 
} 

}

Я испытал это (я использую библиотеку Google GSON), и я был в состоянии успешно читать.

0

После 1 часа отладки вашего массива Json я, наконец, сумел выяснить вашу актуальную проблему. Его не только массив Json Array внутри массива.

Так цикл, как это,

for (int i = 0; i < timeJSONArray.length(); i++) { 

      for(int j= 0;j<i;j++) { 
       int daysByte = timeJSONArray.getJSONArray(i).getJSONObject(j).getInt("daysByte"); 
       int from = timeJSONArray.getJSONArray(i).getJSONObject(j).getInt("from"); 
       int to = timeJSONArray.getJSONArray(i).getJSONObject(j).getInt("to"); 
       Log.d("dataRecieved", "daybyte " + daysByte + "from " + from + "to " + to); 
      } 
} 

И делают другие, как вам нужно.

Смежные вопросы