Analyse de L'objet JSON en Java [dupliquer]
cette question a déjà une réponse ici:
- comment analyser JSON en Java 30 réponses
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
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"));
}
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));
}
}
}
}}
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);
}
}
}
}
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:
- Performance
- facilité d'utilisation (le code est simple à écrire et lisible) - qui va avec les caractéristiques.
- 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.) 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
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