2015-07-01 2 views
0

У меня есть JSONArray, который мне нужно разобрать. Но проблема состоит в том, что один из объектов имеет только одно поле, а у остальных есть два поля.JSONArray не получил правильного анализа

{"Event":{ 
    "Details":[ 
    { 
     "Key" : "AA", 
     "Value" : "a" 
    }, 
    { 
     "Key" : "BB", 
     "Value" :"B" 
    }, 
    { 
     "Key" :"CC" 
    }, 
    { 
     "Key" :"MIN", 
     "Value" : -1 
    } 
] 
}} 

Итак, теперь, когда я анализирую его, используя этот код

private void parse(String jsonStr) throws JSONException{ 
    String Value, Key; 
    JSONObject obj = new JSONObject(jsonStr); 
    JSONArray array = obj.getJSONObject("Event").getJSONArray("Details"); 
    for(int i = 0; i < array.length(); i++) { 
     Key = array.getJSONObject(i).getString("Key"); 
     if(Key.equals("CC")){ // make case for null here 
      Value = "Something was supposed to be here"; 
     } 

     Object type = array.getJSONObject(i).get("Value"); 
     //System.out.println("Type: \n"+type.getClass().getSimpleName()); 
     if(type instanceof String) { 
      String ValueStr=array.getJSONObject(i).getString("Value"); 
      System.out.println(ValueStr); 
     } else if(type instanceof Number) { 
      Integer ValueInt = array.getJSONObject(i).getInt("Value"); 
      System.out.println(ValueInt); 
     } 
    } 
} 

Он перестает разбор после прочтения "CC". Он даже не читает следующее значение. «Значение» для «ключа» CC иногда является нулевым, иногда строковым. Итак, как мне это уловить? Кроме того, как продолжить синтаксический анализ следующего объекта всякий раз, когда значение «Значение» CC равно null?

EDIT: Итак, я помещаю блок try-catch, но for-loop больше не повторяется. Он проходит через цикл только один раз.

for(int i =0; i<array.length() ; i++) 
    { 
     Key = array.getJSONObject(i).getString("Key"); 

     try 
     {   
       Object type = array.getJSONObject(i).get("Value"); 
     //System.out.println("Type: \n"+type.getClass().getSimpleName()); 

      if(type instanceof String) 
      {   
       String ValueStr = array.getJSONObject(i).getString("Value"); 
       System.out.println(ValueStr);    
      } 

      else if(type instanceof Number) 
      {  
       Integer ValueInt = array.getJSONObject(i).getInt("Value"); 
       System.out.println(ValueInt); 
      } 
     } 
     catch(JSONException e){ 
      Value="something was supposed to be here"; 
     } 

    } 
+0

И, видимо, я тоже не могу отформатировать свой код. :/ – user270386

+0

, пожалуйста, сначала подтвердите свой json, «Key»: «AA», «Value»: «a» 'должны быть разделены запятыми, а не попробовать ваш код – Durga

+0

извините, что это была моя ошибка при наборе текста. JSONArray в порядке, его генерация создается другим способом. Опять же, сожалею об этом. Я отредактировал его сейчас – user270386

ответ

0

Как @Durga указала в своем комментарии, вы пропускаете запятые в вашем внутреннем объекте json.

ваш JSON должен быть

{"Event":{ 
    "Details":[ 
    { 
     "Key" : "AA", // see the commas here? 
     "Value" : "a" 
    }, 
    { 
     "Key" : "BB", // see the commas here? 
     "Value" :"B" 
    }, 
    { 
     "Key" :"CC" 
    }, 
    { 
     "Key" :"MIN", // see the commas here? 
     "Value" : -1 
    } 
] 
}} 

и теперь во второй части, ваш код Java, скорее всего, бросить JSONException.

Потому что здесь

Object type = array.getJSONObject(i).get("Value"); 

при переборе по 3 элемента в массиве, объект, не имеющий ключа Value, и, следовательно, get называют вы размещаете на getJSONObject(i).get("Value") выбросит вам JSONException как есть не является таким ключом в объекте.

См документации here

2

Ваш json недействителен. Пожалуйста, подтвердите свой json, а затем попробуйте код.

использовать http://jsonlint.com/ для подтверждения ввода json.

+0

Хотя вход json недействителен, на самом деле он не отвечает на вопрос –

+0

, но он будет представлен с исключением. –

0

первым из всех ваших JSON не является действительным это должно быть что-то вроде этого

{ 
"Event": { 
    "Details": [ 
     { 
      "Key": "AA", 
      "Value": "a" 
     }, 
     { 
      "Key": "BB", 
      "Value": "B" 
     }, 
     { 
      "Key": "CC" 
     }, 
     { 
      "Key": "MIN", 
      "Value": -1 
     } 
    ] 
} 

}

теперь ваш код парсинга нужно проверить «Value» чтобы существовать, если оно существует, тогда получите только значение для клавиши «Значение»

private void parse(String jsonStr) throws JSONException 
{ 

    String Value, Key; 
    JSONObject obj = new JSONObject(jsonStr); 
    JSONArray array = obj.getJSONObject("Event").getJSONArray("Details"); 
    for(int i =0; i<array.length() ; i++) 
    { 
     Key = array.getJSONObject(i).getString("Key"); 

     //if(Key.equals("CC")) // comment this 
     if(!array.getJSONObject(i).has("Value")) //if "Value" key is not exist 
     { 
      Value = "Something was supposed to be here"; 
     } 
     else //if "Value" key exist 
     { 
      //do whatever u like 
      Object type = array.getJSONObject(i).get("Value"); 
      if(type instanceof String) 
      {   
      String ValueStr=array.getJSONObject(i).getString("Value"); 
      System.out.println(ValueStr);    
      } 

      else if(type instanceof Number) 
      {  
      Integer ValueInt = array.getJSONObject(i).getInt("Value"); 
      System.out.println(ValueInt); 
      } 
     } 
     //Object type = array.getJSONObject(i).get("Value");//put this line inside else part 
     //System.out.println("Type: \n"+type.getClass().getSimpleName()); 
    } 
} 
+0

-1. у вас все еще есть проблема. 'Object type = array.getJSONObject (i) .get (« Значение »);' все равно, безусловно, вызовет исключение. он должен быть реструктурирован. вы должны, вероятно, поместить это внутри блока else.Более того, ваш дизайн блока if else является неправильным. почему вы отрицаете условие, когда вы можете просто поменять код в else на блок if и наоборот и удалить отрицание? –

+0

проверить обновленные ans –

+0

Я удалил нижний предел, поскольку исключение теперь предотвращено. но блок if может быть улучшен. удалите оператор отрицания и замените код в блоках if и else. 'if (true) {do A} else {do ​​B} всегда gud, чем, if (! true) {do B} else {do ​​A}' –

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