web-dev-qa-db-fra.com

Analyse d'un objet JSON dans Java

J'ai un objet JSON comme suit:

member = "{interests : [{interestKey:Dogs}, {interestKey:Cats}]}";

Dans Java je veux analyser l'objet json ci-dessus et stocker les valeurs dans une liste.

Je cherche un code à travers lequel je peux y parvenir.

86
user469999

Je suppose que vous voulez stocker les interestKeys dans une liste.

Utilisation de la bibliothèque org.json :

JSONObject obj = new JSONObject("{interests : [{interestKey:Dogs}, {interestKey:Cats}]}");

List<String> list = new ArrayList<String>();
JSONArray array = obj.getJSONArray("interests");
for(int i = 0 ; i < array.length() ; i++){
    list.add(array.getJSONObject(i).getString("interestKey"));
}
142
dogbane
public class JsonParsing {

public static Properties properties = null;

public static JSONObject jsonObject = null;

static {
    properties = new Properties();
}

public static void main(String[] args) {

    try {

        JSONParser jsonParser = new JSONParser();

        File file = new File("src/main/Java/read.json");

        Object object = jsonParser.parse(new FileReader(file));

        jsonObject = (JSONObject) object;

        parseJson(jsonObject);

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public static void getArray(Object object2) throws ParseException {

    JSONArray jsonArr = (JSONArray) object2;

    for (int k = 0; k < jsonArr.size(); k++) {

        if (jsonArr.get(k) instanceof JSONObject) {
            parseJson((JSONObject) jsonArr.get(k));
        } else {
            System.out.println(jsonArr.get(k));
        }

    }
}

public static void parseJson(JSONObject jsonObject) throws ParseException {

    Set<Object> set = jsonObject.keySet();
    Iterator<Object> iterator = set.iterator();
    while (iterator.hasNext()) {
        Object obj = iterator.next();
        if (jsonObject.get(obj) instanceof JSONArray) {
            System.out.println(obj.toString());
            getArray(jsonObject.get(obj));
        } else {
            if (jsonObject.get(obj) instanceof JSONObject) {
                parseJson((JSONObject) jsonObject.get(obj));
            } else {
                System.out.println(obj.toString() + "\t"
                        + jsonObject.get(obj));
            }
        }
    }
}}
10
Code

Merci beaucoup à @Code dans une autre réponse. Je peux lire n'importe quel fichier JSON grâce à votre code. Maintenant, j'essaye d'organiser tous les éléments par niveaux, car je pourrais les utiliser!

Je travaillais avec Android en lisant un JSON à partir d'une URL et il ne me restait plus qu'à changer les lignes.

Set<Object> set = jsonObject.keySet(); Iterator<Object> iterator = set.iterator();

for

Iterator<?> iterator = jsonObject.keys();

Je partage mon implémentation, pour aider quelqu'un:

public void parseJson(JSONObject jsonObject) throws ParseException, JSONException {

    Iterator<?> iterator = jsonObject.keys();
    while (iterator.hasNext()) {
        String obj = iterator.next().toString();

        if (jsonObject.get(obj) instanceof JSONArray) {
            //Toast.makeText(MainActivity.this, "Objeto: JSONArray", Toast.LENGTH_SHORT).show();
            //System.out.println(obj.toString());
            TextView txtView = new TextView(this);
            txtView.setText(obj.toString());
            layoutIzq.addView(txtView);
            getArray(jsonObject.get(obj));
        } else {
            if (jsonObject.get(obj) instanceof JSONObject) {
                //Toast.makeText(MainActivity.this, "Objeto: JSONObject", Toast.LENGTH_SHORT).show();
                parseJson((JSONObject) jsonObject.get(obj));
            } else {
                //Toast.makeText(MainActivity.this, "Objeto: Value", Toast.LENGTH_SHORT).show();
                //System.out.println(obj.toString() + "\t"+ jsonObject.get(obj));
                TextView txtView = new TextView(this);
                txtView.setText(obj.toString() + "\t"+ jsonObject.get(obj));
                layoutIzq.addView(txtView);
            }
        }
    }
}

1.) Créez un répertoire du type approprié, dans ce cas i.e String

2.) Créez un JSONObject en passant votre chaîne au constructeur JSONObject en entrée

  • Comme la notation JSONObject est représentée par des accolades i.e {}
  • Où la notation JSONArray est représentée par des crochets i.e []

3.) Récupérez JSONArray de JSONObject (créé à la deuxième étape) en utilisant _"interests"_ comme index.

4.) parcourir JASONArray en utilisant des boucles allant jusqu'à la longueur du tableau fourni par la fonction length()

5.) Récupérez votre JSONObjects de JSONArray à l’aide de getJSONObject(index) function

6.) Récupérez les données de JSONObject en utilisant l'index '"interestKey"'.

Remarque: JSON utilise la séquence d'échappement pour les caractères imbriqués spéciaux si la réponse Json (généralement d'autres API de réponse JSON) contient des guillemets (") comme ceci

_`"{"key":"value"}"`
_

devrait être comme ça

_`"{\"key\":\"value\"}"`
_

vous pouvez donc utiliser JSONParser pour obtenir le format de séquence échappé pour la sécurité

_JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(inputString);
_

Code:

_JSONParser parser = new JSONParser();
String response = "{interests : [{interestKey:Dogs}, {interestKey:Cats}]}";

JSONObject jsonObj = (JSONObject) parser.parse(response);
_

ou

_JSONObject jsonObj = new JSONObject("{interests : [{interestKey:Dogs}, {interestKey:Cats}]}");
_

_List<String> interestList = new ArrayList<String>();

JSONArray jsonArray = jsonObj.getJSONArray("interests");

for(int i = 0 ; i < jsonArray.length() ; i++){
    interestList.add(jsonArray.getJSONObject(i).optString("interestKey"));
}
_

Remarque: Parfois, vous pouvez voir quelques exceptions lorsque le _values are not available in appropriate type or is there is no mapping key_ donc dans les cas où vous n'êtes pas sûr de la présence de valeur, utilisez donc optString , optInt, optBoolean etc qui renverra simplement la valeur par défaut si elle n’est pas présente et essaie même de convertir la valeur en int si elle est de type chaîne et vice-versa, donc simplement Non null ou NumberFormat des exceptions du tout en cas de clé ou de valeur manquante

De la documentation

Obtenez une chaîne facultative associée à une clé. Il retourne la valeur par défaut s'il n'existe pas de telle clé.

_ public String optString(String key, String defaultValue) {
_
_  String missingKeyValue = json_data.optString("status","N/A");
  // note there is no such key as "status" in response
  // will return "N/A" if no key found 
_

ou Pour obtenir une chaîne vide i.e "" si aucune clé n'est trouvée, utilisez simplement

_  String missingKeyValue = json_data.optString("status");
  // will return "" if no key found where "" is an empty string
_

Autres références à étudier

4
Pavneet_Singh

Il existe de nombreuses bibliothèques JSON disponibles en Java.

Les plus notoires sont: Jackson, GSON, Genson, FastJson et org.json.

Il y a généralement trois choses à considérer pour choisir une bibliothèque:

  1. Performance
  2. Facilité d'utilisation (le code est simple à écrire et lisible) - cela va avec les fonctionnalités.
  3. Pour les applications mobiles: dépendance/taille du pot

Spécifiquement pour les bibliothèques JSON (et toutes les bibliothèques de sérialisation/désérialisation), la liaison de données présente également un intérêt, car elle supprime la nécessité d'écrire du code de plaque chauffante pour compresser/décompresser les données.

Pour 1, voir ce repère: https://github.com/fabienrenaud/Java-json-benchmark J'ai utilisé JMH qui compare (jackson, gson, genson). , fastjson, org.json, jsonp) performances des sérialiseurs et des desérialisateurs à l'aide d'API stream et databind. Pour 2, vous pouvez trouver de nombreux exemples sur Internet. Le repère ci-dessus peut également être utilisé comme source d’exemples ...

Résultat rapide: Jackson est 5 à 6 fois meilleur que org.json et plus de deux fois meilleur que GSON.

Pour votre exemple particulier, le code suivant décode votre json avec jackson:

public class MyObj {

    private List<Interest> interests;

    static final class Interest {
        private String interestKey;
    }

    private static final ObjectMapper MAPPER = new ObjectMapper();
    public static void main(String[] args) throws IOException {
        MyObj o = JACKSON.readValue("{\"interests\": [{\"interestKey\": \"Dogs\"}, {\"interestKey\": \"Cats\" }]}", MyObj.class);
    }
}

Faites moi savoir si vous avez des questions.

1
fabien