2015-08-13 3 views
0

У меня есть этот JSON-файл, и я должен поместить каждое значение тега «info» в ListView с щелчком мыши, чтобы открыть значение url в WebView. Заголовок ActionBar устанавливается со значением тега JSON «title».Как установить тег элемента JSON в ListView?

{ 
"mobiledata": { 
    "geoJson_1": "http://###.###.###", 
    "geoJson_2": "", 
    "info": [ 
     { 
      "title": "Italia", 
      "uri": "https://mysite.wordpress.com/i/" 
     }, 
     { 
      "title": "Il tempo", 
      "uri": "https://mysite.wordpress.com/il/" 
     }, 
     { 
      "title": "Le info", 
      "uri": "https://mysite.wordpress.com/la-terra/" 
     }, 
     { 
      "title": "Il rischio", 
      "uri": "https://mysite.wordpress.com/italia/regioni-italiane/" 
     }, 
     { 
      "title": "Le Rubriche mensili", 
      "uri": "https://mysite.wordpress.com/tag/rubricamensile/" 
     } 
    ] 
} 

}

Как я могу это сделать? Любая помощь или примеры?

+0

адаптер принимает только коллекции. Преобразуйте json в коллекцию и передайте ее адаптеру. – Shriram

ответ

0

Обновление

Подход, данный в старом ответе, является слишком подробным. Этапы улучшения:

  1. Используйте библиотеку Gson, это быстро и компактно. Добавить в файл build.gradle уровня модуля:

    dependencies { 
        // your dependencies: AppCompat, HTTP client etc 
        compile 'com.google.code.gson:gson:2.7' 
    } 
    
  2. Объявить соответствующую структуру данных:

    class InfoItem { 
        String title; 
        String uri; 
    } 
    
  3. Синтаксических данные:

    JsonElement data = new JsonParser().parse(json); 
    
  4. Получить mobiledata.info:

    JsonArray info = data 
         .getAsJsonObject() // treat parsed data as map 
         .getAsJsonObject("mobiledata") // get 'mobiledata' as map 
         .getAsJsonArray("info"); // get 'info' as list 
    
  5. карта разобран jsonObjects в POJOs

    List<InfoItem> items = new Gson() 
         .fromJson(info, new TypeToken<List<InfoItem>>(){}.getType()); 
    
  6. Используйте свой собственный адаптер. С ViewHolder модель связывания будет выглядеть следующим образом:

    InfoItem item = items.get(position); 
    holder.title.setText(item.title); 
    holder.uri.setText(item.uri); 
    

PS Вы можете кэшировать этот уродливый TypeToken:

private static final Type type = 
      new TypeToken<List<InfoItem>>(){}.getType(); 

Полный код для теста:

public class SoJsonAnswer { 

     private static final Type type = 
       new TypeToken<List<InfoItem>>(){}.getType(); 

     public static void main(String[] args) { 
      String json = "{paste it here}"; 
      JsonElement data = new JsonParser().parse(json); 

      JsonArray info = data 
        .getAsJsonObject() // treat parsed data as map 
        .getAsJsonObject("mobiledata") // get map 
        .getAsJsonArray("info"); // get list 

      // map parsed jsonObjects into POJOs 
      List<InfoItem> items = new Gson().fromJson(info, type); 

      System.out.println(items); 
     } 

    } 

    class InfoItem { 
     String title; 
     String uri; 

     @Override 
     public String toString() { 
      return "title=" + title + ", uri=" + uri; 
     } 
    } 

Оригинальный ответ

  1. Включите в свой проект библиотеку JSON. Я использую это: https://code.google.com/p/json-simple/downloads/list

  2. Анализ как объект.

    String json = "{...}"; //Your JSON here 
    JSONParser parser = new JSONParser(); //Can cause ParseException 
    JSONObject obj = (JSONObject) parser.parse(json); //Can cause ClassCastException 
    
  3. Получить внутренние данные.

    JSONObject mobileData = (JSONObject) obj.get("mobiledata"); 
    JSONArray info = (JSONArray) mobileData.get("info"); 
    
  4. Упаковать эти данные в ArrayList. Просто используйте for цикл, get свои вещи и нарисуйте их до String.

    ArrayList<Map<String, Object>> data = new ArrayList<>(info.size()); 
    Map<String, Object> m; 
    JSONObject current; 
    for (int i = 0; i < info.size(); i++) { 
        m = new HashMap<String, Object>(); 
        current = (JSONObject) info.get(i); 
    
        m.put("title", (String) current.get("title")); 
        m.put("url", (String) current.get("url")); 
        data.add(m); 
    } 
    
  5. Набор Adapter для ListView.

    String[] from = { "title", "url" }; 
    int[] to = { android.R.id.text1, android.R.id.text2 }; 
    
    SimpleAdapter adapter = new SimpleAdapter(this, data, android.R.layout.simple_list_item_2, 
    from, to); 
    lvList.setAdapter(adapter); 
    

Надеется, что это помогает. Код не проверен.

+0

Пример hashMap для приведения любого тэга url в строку? –

+0

@dev_, я обновил свой ответ. –

0

Я собираюсь проголосовать за GSON на этом.

Смотрите этот пример кода:

public class MyFunClassName { 
    // GSON matches class names with json keys... but you can get around that with the @SerializedName annotation... see below 
    public MobileData mobileData; 

    public class MobileData { 
     @SerializedName("geoJson_1") // grabs the correct json key so you can name object whatever you want 
     public String someUrl; 

     @SerializedName("geoJson_2") 
     public String someString; 

     public List<Info> info; 

     public class Info { 
      public String title; 
      public String uri; 
     } 
    } 
} 

Теперь, в классе, где вы получаете ответ JSon:

// This uses gson to grab your json response 
// string is required, so just use toString() - Put in object class name so gson knows where to parse the info 
MyFunClassName myFunObject = gson.fromJson(jsonResponse.toString(), MyFunClassName.class); 

// Now you can just use your new fun object 
String chosenUri = myFunObject.mobileData.info.get(1).uri; 
Смежные вопросы