2 votes

JSON Tableau de chaînes de caractères (pas d'objets), extraction de données

Une longue chaîne JSON représentant un tableau de chaînes[] est renvoyée par un service WCF. Les éléments du tableau sont simplement des chaînes de caractères, ce ne sont pas des objets. Voici un exemple des données renvoyées

    ["1|ArrayElement1","2|ArrayElement2","3|ArrayElement3"..."n|ArrayElementn"]

Je n'ai rien contre le fait que l'index soit inclus dans la chaîne de caractères, mais j'ai besoin d'analyser les chaînes de caractères dans une liste de tableaux (ArrayList) dans Android afin de pouvoir l'adapter à une liste d'affichage (ListView).

Puisque, techniquement, ce ne sont pas des JSONObjects, comment puis-je les itérer et extraire la chaîne de chaque élément du tableau ?

8voto

Mahdi Hijazi Points 2240

Il s'agit d'un tableau JSON valide de chaînes de caractères, vous pouvez l'analyser normalement comme suit

JSONArray jsonStrings = json.getJSONArray("items");
String strings[] = new String[jsonStrings.length()];
for(int i=0;i<strings.length;i++) {
strings[i] = jsonStrings.getString(i);
}

0voto

Rob Angelier Points 2310

Peut-être que ce post peut vous aider :

Itération d'un tableau JSON dans Android/Java

  HashMap<String, String> applicationSettings = new HashMap<String,String>();
    for(int i = 0; i < settings.length(); i++){
        String value = settings.getJSONObject(i).getString("value");
        String name = settings.getJSONObject(i).getString("name");
        applicationSettings.put(name, value);
    }

 JSONArray names= json.names();
    JSONArray values = json.toJSONArray(names);
    for(int i = 0 ; i < values.length(); i++){
        if(names.getString(i).equals("description")){
            setDescription(values.getString(i));
        }
        else if(names.getString(i).equals("expiryDate")){
            String dateString = values.getString(i);
            setExpiryDate(stringToDateHelper(dateString)); 
        }
        else if(names.getString(i).equals("id")){
            setId(values.getLong(i));
        }
        else if(names.getString(i).equals("offerCode")){
            setOfferCode(values.getString(i));
        }
        else if(names.getString(i).equals("startDate")){
            String dateString = values.getString(i);
            setStartDate(stringToDateHelper(dateString));
        }
        else if(names.getString(i).equals("title")){
            setTitle(values.getString(i));
        }
    }

0voto

Spencer Ruport Points 24589

Juste pour clarifier, si je comprends bien, vous recevez un tableau JSON de chaînes qui sont des chaînes de JSON valides préfixées avec l'index du tableau et un caractère pipe ?

Tout d'abord, je suggère de contacter le créateur de cette abomination et de lui faire la leçon sur la violation des normes. S'ils n'écoutent pas, parlez-en à leurs patrons. Ce genre de chose est inacceptable à mon avis et doit cesser.

Deuxièmement, je suggérerais de faire quelque chose comme ça :

string[] element_strings = JSON.deserialize(WCF_string_result);
object[] elements = new object[element_strings.length];
for(int x = 0; x < elements.length; x++)
{
    int pipeIndex = element_strings.indexOf("|");
    elements[x] = JSON.deserialize(element_strings[x].substr(pipeIndex + 1));
}

Bien entendu, cela suppose que vous disposiez d'une méthode pour désérialiser les chaînes d'objets JSON. Si ce n'est pas le cas, je vous recommande d'utiliser la bibliothèque intégrée disponible dans Android :

http://developer.Android.com/reference/org/json/package-summary.html

0voto

Atul Points 64

Si vous voulez en extraire une valeur spécifique en utilisant le flux Java8 sur JSONArray. Alors ce code vous aidera.

import java.util.stream.Collectors;
import java.util.stream.IntStream;

import org.json.JSONArray;

public class JsonArrayTest {

    public static void main(String[] args) {
        System.out.println("Output - "+ getValue("[{\"id\":\"11\",\"username\":\"ABC\"},{\"id\":\"12\",\"username\":\"ABC\"}]\""));
        System.out.println("Output - "+ getValue("[{\"id\":\"13\",\"username\":\"XYZ\"}]\""));
    }

    private static String getValue(String input) {
        JSONArray jsonArray = new JSONArray(input);

        return IntStream
                .range(0, jsonArray.length()).mapToObj(obj -> jsonArray.getJSONObject(obj))
                .filter(filterObj -> filterObj.getString("id") != null && "12".equals(filterObj.getString("id")))
                .map(finalObj -> finalObj.getString("username")).collect(Collectors.joining(""));
    }

}

Note : Ceci n'est qu'un exemple de la manière dont vous pouvez extraire une valeur spécifique de JSONArry en utilisant les API de flux. Vous pouvez modifier les conditions de filtrage ou les supprimer en fonction de vos besoins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X