Analyse de L'objet JSON en Java [dupliquer]

cette question a déjà une réponse ici:

j'ai l'objet JSON comme suit:

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

en Java je veux analyser le JSONObject ci-dessus et stocker les valeurs dans un arraylist.

Est-ce que quelqu'un peut s'il vous plaît me fournir un morceau de code à travers lequel je peux atteindre ceci.

Merci

73
demandé sur james.garriss 2011-02-16 14:28:09

5 réponses

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

utilisant le org.json de la bibliothèque:

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"));
}
128
répondu dogbane 2016-04-01 19:55:47
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));
            }
        }
    }
}}
8
répondu Code 2013-07-01 07:10:29

Thank you soooooooooo much to CODE Je peux lire n'importe quel fichier JSON grâce à votre code :) Maintenant, j'essaie d'organiser tous les éléments par niveaux, pour pourrait les utiliser!

je travaillais avec Android lisant un JSON à partir d'une URL et le seul que j'ai eu à changer était les lignes

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

pour

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);
            }
        }
    }
}
3
répondu Linda Carolina Martinez Rodrig 2015-03-20 05:58:04

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

les plus célèbres sont Jackson, Gson, Genson, FastJson et org.json.

il y a typiquement trois choses que l'on devrait regarder pour choisir n'importe quelle bibliothèque:

  1. Performance
  2. facilité d'utilisation (le code est simple à écrire et lisible) - qui va avec les caractéristiques.
  3. pour applications mobiles: dépendance / jar size

spécifiquement pour les bibliothèques JSON (et toutes les bibliothèques de serialization/deserialization libs), databinding est également d'un intérêt général car il supprime la nécessité d'écrire un code chaudière-Plaque pour emballer/déballer les données.

Pour 1, voir ce test: https://github.com/fabienrenaud/java-json-benchmark je l'ai fait à l'aide de JMH qui compare (jackson, gson, genson, fastjson, org.json, jsonp) rendement de sérialiseurs et deserializers à l'aide de flux et databind Api. Pour 2, vous pouvez trouver de nombreux exemples sur Internet. Le benchmark ci-dessus peut également être utilisé comme source d'exemples...

Rapide à emporter de l'indice de référence: Jackson effectue 5 à 6 fois mieux que org.json et plus de deux fois mieux 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);
    }
}

dites-moi si vous avez des questions.

1
répondu fabien 2016-06-27 20:28:48

1.) Créer un arraylist de type approprié, dans ce cas I. e String

2.) Créez un JSONObject en passant votre chaîne de caractères à JSONObject constructeur en entrée

  • comme JSONObject la notation est représentée par les accolades I. e {}
  • où la notation JSONArray est représentée entre crochets I. e []

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

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

5.) Récupérez votre JSONObjects de JSONArray en utilisant getJSONObject(index) fonction

6.) De récupérer les données à partir de JSONObject à l'aide de l'indice de"interestKey"'.

Note: JSON parsing 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 citations ( " ) comme ceci

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

devrait être comme ceci

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

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

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"));
}

Note : parfois, vous pouvez voir des exceptions lorsque le values are not available in appropriate type or is there is no mapping key ainsi, dans les cas où vous n'êtes pas sûr de la présence de la valeur afin d'utiliser optString , optInt , optBoolean etc qui retournera simplement la valeur par défaut si elle n'est pas présent et même essayer de convertir la valeur en int si elle est de type chaîne et vice-versa si simplement pas d'exceptions null ou NumberFormat du tout en cas de clé ou de valeur manquante

De docs

obtenez une chaîne de caractères optionnelle associée à une clé. Elle renvoie l' defaultValue s'il n'y a pas une 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 je.e "" si aucune touche n'trouvé, il suffit ensuite d'utiliser

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

autre référence à l'étude

1
répondu Pavneet_Singh 2017-05-23 12:26:05