2015-03-09 3 views
0

Недавно я начал работу над приложением, которое выполняет запрос на сервер и получает ответ json.String [] from ArrayList <Class>

«вещь» функционировала красиво, пока мне не пришлось внедрять новые вещи в список, и теперь у меня есть трудное время, чтобы исправить это.

Любая помощь очень ценится:

class RemoteConfig 
{ 

// names and type must match what we get from the remote 
String[] username; 

ArrayList<accDetails> in_groups; 

String[] in_groups_sorted; 

class accDetails 
{ 
    int group_id; 
    String group_label; 
    Boolean _is_system; 
} 

Это лишь часть того, как начинается класс, и вот как JSON réponse выглядит следующим образом:

{ 
"username":[ 
    "mike" 
], 
"in_groups":[ 
    { 
     "group_id":2, 
     "group_label":"All users", 
     "_is_system":true 
    }, 
    { 
     "group_id":4372, 
     "group_label":"Privileged User", 
     "_is_system":false 
    }, 
    { 
     "group_id":4979, 
     "group_label":"Supervisor", 
     "_is_system":false 
    } 
] 
} 

Проблема, что я столкнуться что я не знаю, как разбить список массивов in_groups и получить в String [] in_groups_sorted значение Group_label, если значение _is_system является ложным.

Любая помощь очень ценится.

Спасибо, Майк


После проверки ответов, чистейшая и простейшая был один обеспечивается Аббе:

public String[] groupSettings() 
{ 
    String[] levels = new String[] {}; 

    if (remoteConfig != null && remoteConfig.in_groups != null){ 
     for (accDetails ad: remoteConfig.in_groups) 
     { 
      if (!ad._is_system) { 
       levels = ArrayUtils.addAll(levels, ad.group_label); ; 
      } 
     } 
    } 

    return levels; 
} 
+0

Вы разбираете json (используя JsonObject/JsonArray и т. Д.) Или вы позволяете API строить объект для вас? –

+0

Спасибо всем за вашу помощь. Я собирался далеко задуматься, и я забыл, чтобы это было просто. Я использовал часть кода, предложенную @Abbe Resina, и она работала правильно. Другие были успешными, но это было самое простое –

ответ

1

Из Вашего вопроса, я полагаю, что JSON уже разбирается и хранится в in_groups области RemoteConfig класс. И вам просто нужно отфильтровать необходимую информацию, чтобы заполнить поле in_group_sorted.

Добавьте следующий к RemoteConfig класса:

public initGroupSorted() { 
    // Temporary list, since we don't know the size once filtered 
    List<String> labels = new ArrayList<>(); 
    for (accDetails ad : in_groups) { 
     if (ad._is_system) { 
     groups.add(ad.group_label); 
     } 
    } 
    in_group_sorted = labels.toArray(new String[labels.size()]); 
} 
+0

Спасибо. Я изменил его для своих нужд, и теперь он работает :) Простой и чистый –

0

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

public void createObjects(String rawJSON) { 
     try { 
      JSONObject object = new JSONObject(rawJSON); 
      JSONArray username = object.getJSONArray("username"); 
      JSONArray inGroups = object.getJSONArray("in_groups"); 

      RemoteConfig config = new RemoteConfig(); 
      config.in_groups = new ArrayList<>(); 
      config.username = username.getString(0); 

      for (int i = 0; i < inGroups.length(); i++) { 
       JSONObject group = inGroups.getJSONObject(i); 
       if (!group.getBoolean("_is_system")) { 
        accDetails details = new accDetails(); 
        details.group_id = group.getInt("group_id"); 
        details.group_label = group.getString("group_label"); 
        details._is_system = false; 
        config.in_groups.add(details); 
       } 
      } 

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

Спасибо.Теперь я проведу тест и дам вам знать, как это работает. –

1

, если вы не хотите изменить способ анализа вашего JSON, вы всегда можете это сделать:

Пусть accDetails реализует Comparable, а затем используйте Collections.sort, проходящие in_groups.

, если вы действительно хотите, String [], вы всегда можете перебирать in_groups, добавить к in_groups_sorted, а затем с помощью Arrays.sort

0

Здесь является Java 8 Решение с использованием Stream'sfilter, sorted и map методы:

//ArrayList<accDetails> in_groups is already populated 
Stream<accDetails> tempStream= in_groups.stream().filter(p -> p._is_system == false); 
tempStream= tempStream.sorted((accDetails o1, accDetails o2) -> o1.group_label.compareTo(o2.group_label)); 
String[] in_groups_sorted = tempStream.map(s -> s.group_label).toArray(String[]::new); 

Разделенные вызовы для видимости, но они может быть одним лайнером:

String[] in_groups_sorted = in_groups.stream().filter(p -> p._is_system == false).sorted((accDetails o1, accDetails o2) -> o1.group_label.compareTo(o2.group_label)).map(s -> s.group_label).toArray(String[]::new); 
Смежные вопросы