java解析推文语料库json

时间:2017-06-29 15:55:57

标签: java json twitter

我遇到了一个问题:我需要在Java中解析一个JSON文件,其中每一行代表一条推文并遵循Twitter的标准JSON。我不需要所有的信息,我附上两张照片,以显示我需要的字段。我会在不使用任何支持库的情况下完成。谢谢!

这就是我现在所做的。我不认为这是最好的方法,特别是继续我会遇到麻烦,因为许多领域的名称重复

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TweetCorpus implements Iterable<Tweet>
{
    private List<Tweet> tweets;

    public static TweetCorpus parseFile(File file)
    {
        List<Tweet> tweets = new ArrayList<>();

        try(BufferedReader br = Files.newBufferedReader(file.toPath()))
        {
            while(br.ready())
            {
                String tweet = br.readLine();
                //System.out.println(tweet);
                if(!tweet.isEmpty())
                {
                    long l = Long.parseLong(tweet.substring(tweet.indexOf("\"id\":") + 5, tweet.indexOf(",\"id_str\":")));
                    String t = tweet.substring(tweet.indexOf(",\"text\":\"") + 9, tweet.indexOf(",\"source\":"));
                    tweets.add(new Tweet(l, t));
                }
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }

        return new TweetCorpus(tweets);
    }

    public int getTweetCount() { return tweets.size(); }

    public TweetCorpus(List<Tweet> tweets)
    {
        this.tweets = tweets;
    }

    @Override
    public Iterator<Tweet> iterator()
    {
        return tweets.iterator();
    }

    public static void main(String[] args)
    {
        TweetCorpus t = parseFile(new File("C:\\Users\\acer\\Desktop\\Moroder\\Uni\\1 Anno - 2 Semestre\\Metodologie Di Programmazione\\Progetto\\HM4Test\\tweetsCorpus.js"));
        t.getTweetCount();

    }
}

json media /转发推文 json media/retweet tweet

json“正常”推文 json "normal" tweet

2 个答案:

答案 0 :(得分:0)

仅使用readLine()重新发明JSON解析器是一个非常糟糕的主意。如果您没有亲自编写解析器的经验,那么最终会遇到很多难以理解的错误代码。只需使用图书馆。 Java有很多优秀的JSON库。

示例代码:

static class User {
    String id, name;
}
static class MyTweet {
    String id, text;
    User user;
}
// if the entire file is a JSON array:
void parse(Reader r) {
    List<MyTweet> tweets = objectMapper.readValue(
        r, new TypeReference<List<MyTweet>>(){});
}
// if each line is a single JSON object:
void parse(BufferedReader r) {
    while (r.ready()) {
        String line = r.readLine();
        MyTweet tweet = objectMapper.readValue(line, MyTweet.class);
    }
}

答案 1 :(得分:0)

您可以使用Gson或Jackson java库将json解析为Tweet对象。他们是在线工具,可以从json生成pojo,你可以使用jackson将你的json字符串解析为object。

在对象中有json值后,可以使用getters / setter从输入json中提取/修改您感兴趣的值。

编写自己的解析器将重新创建轮式任务。但如果您需要编写自己的解析器,请参阅github上的jackson项目,获取设计和维护的灵感。 这将有助于您制作通用应用程序。

jackson解析器的快速参考, https://dzone.com/articles/processing-json-with-jackson