La lecture de la valeur de la clé imbriquée dans JSON avec Java (Jackson)
Je suis un nouveau programmeur Java à venir à partir d'un arrière-plan en Python. J'ai météo données qui sont collectées et retourné comme un JSON avec clés imbriquées, et je ne comprends pas comment tirer les valeurs dans cette situation. Je suis sûr que cette question a été posée, mais je vous jure que j'ai Cherché sur google et je n'arrive pas à trouver une réponse. Droit maintenant, je suis en utilisant json simple, mais j'ai essayé de commutation à Jackson et ne pouvait toujours pas comprendre comment le faire. Depuis Jackson/Gson semblent être la plupart des bibliothèques utilisées, j'avais aimerais voir un exemple d'utilisation de l'une de ces bibliothèques. Ci-dessous est un échantillon de données, suivi par le code que j'ai écrit jusqu'à présent.
{
"response": {
"features": {
"history": 1
}
},
"history": {
"date": {
"pretty": "April 13, 2010",
"year": "2010",
"mon": "04",
"mday": "13",
"hour": "12",
"min": "00",
"tzname": "America/Los_Angeles"
},
...
}
}
Fonction principale
public class Tester {
public static void main(String args[]) throws MalformedURLException, IOException, ParseException {
WundergroundAPI wu = new WundergroundAPI("*******60fedd095");
JSONObject json = wu.historical("San_Francisco", "CA", "20100413");
System.out.println(json.toString());
System.out.println();
//This only returns 1 level. Further .get() calls throw an exception
System.out.println(json.get("history"));
}
}
La fonction "historique" en appelle une autre fonction qui retourne un JSONObject
public static JSONObject readJsonFromUrl(URL url) throws MalformedURLException, IOException, ParseException {
InputStream inputStream = url.openStream();
try {
JSONParser parser = new JSONParser();
BufferedReader buffReader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
String jsonText = readAll(buffReader);
JSONObject json = (JSONObject) parser.parse(jsonText);
return json;
} finally {
inputStream.close();
}
}
OriginalL'auteur Jon.H | 2015-04-24
Vous devez vous connecter pour publier un commentaire.
Avec Jackson modèle d'arbre (
JsonNode
), vous avez à la fois "littérale" des méthodes accesseurs ('get'), qui renvoienull
pour la valeur manquante, et "safe" accesseurs ("path"), qui vous permettent de traverser les "disparus" nœuds. Ainsi, par exemple:qui permettrait le retour à la valeur, au chemin d'accès donné, ou, si le chemin est manquant, 0 (valeur par défaut)
Mais pour plus de commodité, vous pouvez simplement utiliser JSON pointeur expression:
Il ya d'autres façons aussi, et souvent il est plus commode de fait le modèle de votre structure de Plain Old Java Object (POJO).
Votre contenu pourrait correspondre à quelque chose comme:
et si oui, vous serait traverser les objets qui en résultent comme tout les objets Java.
Depuis Java est statiquement typé, contrairement à Python (ou peut-être plus), je pense que POJO modèle s'adapte le plus naturellement puisque vous puis de travailler sur la base des objets Java, et ne pas s'inquiéter JSON partie. Vous venez de définir les objets à aligner avec JSON, et de la bibliothèque (Jackson, GSON) peut convertir de l'un à l'autre. Si oui, les travaux de construction, de manipulation, modification de données qui se passe avec Pojo, et la conversion vers/à partir de JSON est séparé automatisé de sérialisation étape. Certains développeurs trouver cela plus simple et de plus naturel, alors que d'autres préfèrent le plus dynamique de l'accès à l'arborescence. Donc, une partie de qui va dans les préférences, d'autres à des cas d'utilisation.
... Je voudrais avoir un exemple simple, mais je pense que de nombreux services REST (JAX-RS, DropWizard) peut montrer quelques-uns des avantages d'utilisation. En résumé, l'existence de JSON et/ou XML peut être abstrait; l'entrée et la sortie est de la forme des objets. Je pense que c'est le principal avantage vraiment. Mais comme je l'ai dit, une partie de c'est question de goût, les préférences personnelles.
Mais plus je la regarde d'autres implémentations de Jackson, en plus je crois que je commence à comprendre l'élégance derrière la modélisation de données comme un POJO, pour l'instant, l'explication sur la façon d'utiliser le JsonNode objet de Jackson est exactement ce dont j'ai besoin. Merci!!!!
Vous êtes les bienvenus!
OriginalL'auteur
Utilisation Jsonpath
Entier h = JsonPath.parse(json).lire("$.réponse.référentiel.l'histoire", Integer.class);
OriginalL'auteur
Découvrez Jackson ObjectMapper. Vous pouvez créer une classe de modèle de votre JSON puis utilisez ObjectMapper de readValue méthode de "désérialiser" votre Chaîne JSON dans une instance de votre classe de modèle. Et vice-versa.
OriginalL'auteur
Essayer jpath API. C'est xpath équivalent pour les Données JSON. Vous pouvez lire les données en fournissant les jpath qui va traverser les données JSON et le retour de la valeur demandée.
Cette classe Java est la mise en œuvre ainsi qu'il a exemple des codes sur la façon d'appeler les Api.
https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java
Readme -
https://github.com/satyapaul/jpath/blob/master/README.md
Exemple:
Données JSON:
Extrait de Code:
OriginalL'auteur