2013-05-31 3 views
0

J'ai une chaîne au format json et je veux extraire certaines valeurs de ce json. Par exemple:extrait la valeur de json string en java

{"foo":"this is foo", "bar":{"nested_bar": "this is nested bar"} } 

Un utilisateur peut vouloir imprimer soit foo ou bar, ou les deux.

À l'heure actuelle, j'ai une classe simple qui ne peut lire que flat json. Comment modifier le code suivant pour incorporer json imbriqué?

Une autre question est ce qui est un bon moyen de représenter les balises que je veux extraire comme en json plat? Je passais un tableau.

public class JsonParser { 

public static String[] tagsToExtract; 



public JsonParser(String[] tags){ 
    tagsToExtract = tags; 
} 


public HashMap<String, Object> extractInformation(Text line) throws JSONException{ 
    HashMap<String, Object> outputHash = new HashMap<String, Object>(); 
    JSONObject jsn = new JSONObject(line.toString()); 
    for (int i =0; i < tagsToExtract.length; i++){ 
     outputHash.put(tagsToExtract[i],jsn.get(tagsToExtract[i].toString())); 
    } 
    return outputHash; 

} 

} 
+5

Avez-vous envisagé d'utiliser une bibliothèque d'analyse JSON comme, par exemple, Jackson? – fge

+2

Oui, si vous allez sur json.org, il répertorie environ une douzaine de parseurs JSON pour Java. –

Répondre

1

Il existe pas mal de bibliothèques JSON pour Java qui feront exactement ce que vous voulez. Quelques-uns des plus réputés sont:

Et vous pouvez trouver une discussion plus approfondie des différentes options: https://stackoverflow.com/questions/338586/a-better-java-json-library

Si vous êtes vraiment intéressé à écrire votre propre analyseur pour cela, cependant, l'indice que je vais donner est de profiter de la récursivité. Supposons que vous avez un objet JSON quelque chose comme ceci: vous allez faire

{ 
    prop1: (some value), 
    prop2: (some value), 
    ... 
} 

Notez que lorsque vous démarrez l'analyse de l'objet de niveau supérieur, vous faites exactement la même chose que lorsque vous analysez chaque valeur - parce que la les valeurs elles-mêmes peuvent être juste un autre objet JSON. Donc, une façon simple de commencer serait d'écrire un analyseur qui obtient juste les clés et leurs valeurs associées en tant que chaînes, sans traiter les valeurs. Ensuite, appelez le même algorithme sur chaque valeur - et ainsi de suite, jusqu'à ce que vous obteniez une valeur qui est juste une valeur simple - une chaîne, un nombre, etc

Questions connexes