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.
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"));
}
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));
}
}
}
}}
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
JSONObject
est représentée par des accolades i.e {}
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
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
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:
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.