Je souhaite finalement créer des index inversés à l'aide de mon ensemble de données JSON. Je sais comment analyser un objet JSON, mais comment puis-je en parcourir plusieurs? Voici ce que je travaille:
File1:
[ { "doc_id": "2324jos", "screen_name": "b'LIBBYRULZ'", "tweet_text": "@ABC ya'll be lying", "hashtags": "[]", "links": "[]", "place_type": "city", "place_name": "Evergreen Park", "created_at": "2019-02-08 22:24:03" }, { "doc_id": "8982hol", "screen_name": "b'eddylee_1'", "tweet_text": "Hungry for money", "hashtags": "[]", "links": "[]", "place_type": "city", "place_name": "Manhattan", "created_at": "2/7/2019 17:01" } ]
Mon code:
public class ParseJson { public static void main(String[] args) throws Exception { // this is the key object to convert JSON to Java Tweet tweet; ObjectMapper mapper = new ObjectMapper(); try { File json = new File("test.json"); tweet = mapper.readValue(json, Tweet.class); System.out.println("Java object created from JSON String :"); System.out.println(tweet); } catch (IOException ex) { ex.printStackTrace(); } } } public class Tweet { public String doc_id; public String screen_name; public String tweet_text; public String hashtags; public String links; public String place_type; public String place_name; public String created_at; public Tweet() { } public Tweet(String doc_id, String screen_name, String tweet_text, String hashtags, String links, String place_type, String place_name, String created_at) { this.doc_id = doc_id; this.screen_name = screen_name; this.tweet_text = tweet_text; this.hashtags = hashtags; this.links = links; this.place_name = place_name; this.place_type = place_type; this.created_at = created_at; } @Override public String toString() { return doc_id + screen_name + tweet_text; } }
Maintenant, je veux Parcourez ce fichier JSON qui contient 2 objets JSON dans un tableau:
File2:
{ "doc_id": "2324jos", "screen_name": "twitter_user101", "tweet_text": "Its a beautiful day to be productive", "hashtags": "[]", "links": "[]", "place_type": "city", "place_name": "Evergreen Park", "created_at": "2019-02-08 22:24:03" }
Comment puis-je ajuster mon code ci-dessus en utilisant Jackson pour le faire où doc_id est la clé unique? Je veux pouvoir renvoyer toutes les données de chaque objet JSON pour chaque doc_id.
3 Réponses :
Pour analyser un tableau d'objets JSON en utilisant Jackson:
public class ParseJson { public static void main(String[] args) throws Exception { Tweet[] tweets; ObjectMapper mapper = new ObjectMapper(); try { File json = new File("test.json"); tweets = mapper.readValue(json, Tweet[].class); System.out.println("Java object created from JSON String :"); Arrays.asList(tweets).forEach(System.out::println); // Prints each element in the array } catch (IOException ex) { ex.printStackTrace(); } } }
devrait faire l'affaire. Voir ci-dessous:
Tweet[] tweets = mapper.readValue(json, Tweet[].class);
Merci - pouvez-vous le montrer peut-être avec un peu plus de contexte - J'obtiens une erreur: org.codehaus.jackson.map.JsonMappingException: impossible de désérialiser l'instance de Tweet à partir du jeton START_ARRAY
Vous obtenez cette exception car vous essayez de mapper un tableau JSON à un objet Java. Vous devez mapper le tableau JSON à une liste d'objets java ou à un tableau d'objets java.
Merci Matt - J'ai encore des problèmes, pouvez-vous reproduire le code ci-dessus avec vos modifications? Si c'est le cas, je marquerai ceci comme la réponse acceptée :)
Je viens d'ajouter votre classe ParseJson à la réponse ci-dessus!
Vous pouvez essayer de le mettre dans une liste afin de pouvoir le parcourir:
List<Tweet> data = mapper.readValue(json, new TypeReference<List<Tweet>>(){});
Je suggérerais d'utiliser TypeFactory pour créer un CollectionType
et l'utiliser pour analyser le JSON en tant que List
.
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.CollectionType; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class ParseJson { public static void main(String[] args) { // this is the key object to convert JSON to Java ObjectMapper mapper = new ObjectMapper(); try { File json = new File("test.json"); CollectionType tweetListType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, Tweet.class); List<Tweet> tweets = mapper.readValue(json, tweetListType); System.out.println("Java objects created from JSON String:"); tweets.forEach(System.out::println); } catch (IOException ex) { ex.printStackTrace(); } } }
Voici l'exemple complet que vous avez partagé:
CollectionType tweetListType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, Tweet.class); List<Tweet> tweets = mapper.readValue(json, tweetListType); tweets.forEach(System.out::println);
quel est l'import pour cela?
Importation de CollectionType? import com.fasterxml.jackson.databind.type.CollectionType;
génial merci, cela a fonctionné et a amélioré ma compréhension du type de collection!