Как я могу перебирать объекты JSON, используя Джексона? - PullRequest
0 голосов
/ 01 марта 2019

В конечном итоге я хочу создать инвертированные индексы, используя мой набор данных JSON.Я знаю, как анализировать один объект JSON, но как я могу выполнить итерацию по многим?Вот что у меня работает:

Файл1:

{
    "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"
}

Мой код:

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;
    }
}

Теперь я хочу перебрать этот файл JSON, который имеет 2 JSONобъекты в массиве:

File2:

[
    {
        "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"
    }
]     

Как я могу настроить свой код выше, используя Джексона, чтобы doc_id был уникальным ключом?Я хочу иметь возможность вернуть все данные в каждом объекте JSON для каждого doc_id.

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Вы можете попытаться поместить его в список, чтобы вы могли повторять его:

List<Tweet> data = mapper.readValue(json, new TypeReference<List<Tweet>>(){});
0 голосов
/ 01 марта 2019

Я бы предложил использовать TypeFactory для создания CollectionType и использовать его для анализа JSON как List<Tweet>.

CollectionType tweetListType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, Tweet.class);
List<Tweet> tweets = mapper.readValue(json, tweetListType);
tweets.forEach(System.out::println);

Вот полный пример, которым вы поделились:

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();
        }
    }
}
0 голосов
/ 01 марта 2019

Для анализа массива JSON-объектов с использованием Джексона:

Tweet[] tweets = mapper.readValue(json, Tweet[].class);

должно сработать.Смотрите ниже:

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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...