2013-06-04 2 views
0

Это логическая проблема. Кажется, я не могу обернуть голову, но я думаю Я близок. Я получаю значения от ответа JSON и сохраняю их внутри HashMap, затем добавляя HashMap к ArrayList.create Views from HashMap внутри ArrayList

doInBackground

protected String doInBackground(String... args) { 

      // getting JSON string from URL 
      companyName = cn.getText().toString(); 
      projectName = pn.getText().toString(); 
      String componentName = (String) ab.getSelectedTab().getText(); 

      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3); 
      nameValuePairs.add(new BasicNameValuePair("company", companyName)); 
      nameValuePairs.add(new BasicNameValuePair("project", projectName)); 
      nameValuePairs.add(new BasicNameValuePair("component", 
        componentName)); 

      JSONObject json = jParser.makeHttpRequest(url, "POST", 
        nameValuePairs); 

      // Check your log cat for JSON response 
      Log.d("All Questions: ", json.toString()); 

      try { 
       // Checking for SUCCESS TAG 
       int success = json.getInt(TAG_SUCCESS); 

       if (success == 1) { 
        Log.v("RESPONSE", "Success!"); 
        // products found: getting Array of Questions 
        questions = json.getJSONArray(TAG_QUESTIONS); 

        // looping through All Questions 
        for (int i = 0; i < questions.length(); i++) { 

         JSONObject c = questions.getJSONObject(i); 

         // Storing each JSON item in variable 
         String name = c.getString(TAG_NAME); 
         String field = c.getString(TAG_FIELD); 
         String value = c.getString(TAG_VALUE); 

         // creating new HashMap 
         HashMap<String, String> map = new HashMap<String, String>(); 

         // adding each child node to HashMap key => value 
         map.put(TAG_NAME, name); 
         map.put(TAG_FIELD, field); 
         map.put(TAG_VALUE, value); 
         for (String key: map.keySet()) { 
          System.out.println("key : " + key); 
          System.out.println("value : " + map.get(key)); 
         } 
         infoList.add(map); 
        } 

       } else { 
        // no products found 
        Log.v("ERROR", "No JSON for you!"); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

Теперь выше for loop печатает следующее из моего JSON

06-03 19:35:29.928: I/System.out(9691): key : option_value 
06-03 19:35:29.928: I/System.out(9691): value : 
06-03 19:35:29.928: I/System.out(9691): key : field_type 
06-03 19:35:29.928: I/System.out(9691): value : Text Field 
06-03 19:35:29.928: I/System.out(9691): key : display_name 
06-03 19:35:29.928: I/System.out(9691): value : Store # 
06-03 19:35:29.928: I/System.out(9691): key : option_value 
06-03 19:35:29.928: I/System.out(9691): value : 
06-03 19:35:29.928: I/System.out(9691): key : field_type 
06-03 19:35:29.928: I/System.out(9691): value : Text Field 
06-03 19:35:29.928: I/System.out(9691): key : display_name 
06-03 19:35:29.938: I/System.out(9691): value : Address 
06-03 19:35:29.938: I/System.out(9691): key : option_value 
06-03 19:35:29.938: I/System.out(9691): value : Education 
06-03 19:35:29.938: I/System.out(9691): Health 
06-03 19:35:29.938: I/System.out(9691): Computers 
06-03 19:35:29.938: I/System.out(9691): Food 
06-03 19:35:29.938: I/System.out(9691): Retail 
06-03 19:35:29.938: I/System.out(9691): Other 
06-03 19:35:29.938: I/System.out(9691): key : field_type 
06-03 19:35:29.938: I/System.out(9691): value : Drop Down Menu 
06-03 19:35:29.938: I/System.out(9691): key : display_name 
06-03 19:35:29.938: I/System.out(9691): value : Type of Business 
06-03 19:35:29.938: I/System.out(9691): key : option_value 
06-03 19:35:29.938: I/System.out(9691): value : Yes 
06-03 19:35:29.938: I/System.out(9691): No 
06-03 19:35:29.938: I/System.out(9691): key : field_type 
06-03 19:35:29.938: I/System.out(9691): value : Radio 
06-03 19:35:29.938: I/System.out(9691): key : display_name 
06-03 19:35:29.938: I/System.out(9691): value : Is this business good? 
06-03 19:35:29.938: I/System.out(9691): key : option_value 
06-03 19:35:29.938: I/System.out(9691): value : Yes 
06-03 19:35:29.938: I/System.out(9691): No 
06-03 19:35:29.938: I/System.out(9691): key : field_type 
06-03 19:35:29.938: I/System.out(9691): value : Check Box 
06-03 19:35:29.938: I/System.out(9691): key : display_name 
06-03 19:35:29.938: I/System.out(9691): value : Are they nice people? 

JSON

{ 
    "questions": [ 
     { 
      "display_name": "Store #", 
      "field_type": "Text Field", 
      "option_value": "" 
     }, 
     { 
      "display_name": "Address", 
      "field_type": "Text Field", 
      "option_value": "" 
     }, 
     { 
      "display_name": "Type of Business", 
      "field_type": "Drop Down Menu", 
      "option_value": "Education\r\nHealth\r\nComputers\r\nFood\r\nRetail\r\nOther" 
     }, 
     { 
      "display_name": "Is this business good?", 
      "field_type": "Radio", 
      "option_value": "Yes\r\nNo" 
     }, 
     { 
      "display_name": "Are they nice people?", 
      "field_type": "Check Box", 
      "option_value": "Yes\r\nNo" 
     } 
    ], 
    "success": 1 
} 

сейчас в onPostExecute() Мне нужно пройти через мой ArrayList с именем «infoList», а затем получить значения HashMap. Основываясь на этой информации, мне нужно создать Views. Поэтому мой код должен выглядеть примерно так, но я не могу понять это правильно.

protected void onPostExecute(String string) { 
    // dismiss the dialog 
    pDialog.dismiss(); 
    for (int i = 0; i < infoList.size(); i++) { 
     // get HashMap, how? i.toString()? 
     for (String key: map.keySet()) { 
     if (map.get(key).equals("Radio")) { 
       //create RadioButtons, setTexts to option_value values   
      } else if (map.get(key).equals("Text Field")) { 
       //create EditText 
      } else if (map.get(key).equals("Check Box")) { 
       //create CheckBox's, setTexts to option_value values 
      } else if (map.get(key).equals("Drop Down Menu")) { 
       //create Spinner, place option_value values into array and populate 
      } 
     } 
    } 

Так я делаю это сложнее, чем это должно быть? Я чувствую, что они должны быть проще. Если нет, я бы очень признателен за помощь в написании этого for loop.

Редактировать в ответ на комментарии

Я хотел бы, чтобы раздуть макет внутри fragment, который выглядит, как это

Store # ------------------ <EditText> 
Address ------------------ <EditText> 
Is this business good? --- <RadioButton> 

и т.д. и т.п. RadioButton или Checkbox будет их текст установлен optional_values ​​

Когда это будет сделано, я пошлю его обратно в базу данных, изначально я получил это.

+1

Уход, чтобы показать некоторые данные вашего JSON? Похоже, вам не нужен весь этот механизм, когда какая-то библиотека JSON уже имеет то, что вам нужно ... (личное мнение: 'org.json' - довольно белая библиотека, когда вы хотите навигация) – fge

+0

@fge отправил JSON, если есть что-то сделать для меня, пожалуйста, дайте мне знать –

+1

На самом деле да: какой результат вы ожидаете от такого входа JSON? И что вы ожидаете от этого? – fge

ответ

1

Вы делаете это сложнее для себя, чем то, что может быть, используя несоответствующую библиотеку.

Используйте Jackson, вам будет намного проще выполнять то, что вы хотите. Во-первых, возьмите JsonNode от источника входного сигнала, обычно это делается с помощью ObjectMapper:

// "mapper" is an already initialized ObjectMapper 
final JsonNode response = mapper.readTree(yourURL); // catch, treat IOException 

Теперь, читайте success:

if (response.get("success").intValue() != 1) 
    // deal with failure 

успеха?Сделка со всеми значениями:

for (final JsonNode question: response.get("questions")) 
    // do something with "question", which is an element of the "questions" array 

См. Документацию по JsonNode. Просто нет лучшего класса, предназначенного для доступа/навигации JSON в Java.

После этого, если вам нужно/хотите, вы можете использовать аннотации для десериализации каждого вопроса на POJO и справиться с этим. Вот пример, который я сделал для работы JSON Patch:

https://github.com/fge/json-patch/blob/master/src/main/java/com/github/fge/jsonpatch/JsonPatchOperation.java

Этот файл будет генерировать различные реализации JsonPatchOperation в соответствии с тем, что значение "op" член; например:

{ "op": "remove", "path": "/foo" } 

будет генерировать RemoveOperation.

Джексон может показаться довольно сложным для начала; но как только вы знаете, как его использовать, это легкий ветерок.

+0

Спасибо вам большое. Это было упражнение на протяжении недели, которое пыталось вручную создать «U.I.» из ответа «JSON». Я использовал классы, объекты, для циклов и т. Д., И это не только медленно, но и делает его очень сложным. Я посмотрю API и займусь изучением. Надеюсь, это решение, которое я искал –

+1

См. Также отредактированный ответ. Джексон на самом деле ОСОБЕННО мощный, когда речь заходит о десериализации. – fge

+0

Отмечено, еще раз спасибо! –

3

Построить POJO класс для ваших вопросов:

Class Questions{ 
private String Name; 
private String field_type; 
private ArrayList option_value; 
<Getter and Setters> 
} 

Используйте это как класс POJO. И добавьте это в ArrayList.

Использование карты только тогда, когда вам это нужно. Для передачи данных с использованием POJO/Business Objects достаточно и наилучшим образом подходит.

Пожалуйста, дайте мне знать ваши мысли.

+0

Я попытаюсь использовать Джексон, как fge. Спасибо за вклад, это может сработать. Я просто ничего не знаю о «POJO», поэтому я тоже буду изучать это. –