2017-06-29 91 views
0

我有一个问题:我需要解析一个Java中的JSON文件,其中每行代表一条推文,并遵循Twitter的标准JSON。我不需要所有的信息,我附上两张照片来向你展示我需要的领域。我会做,而不使用任何支持库。谢谢!java解析推文语料库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媒体/转推鸣叫 json media/retweet tweet

JSON “正常”的鸣叫 json "normal" tweet

回答

0

使用重新发明了JSON解析器仅readLine()是一个非常糟糕的主意。如果您没有手工编写解析器的经验,最终会遇到很多难以理解的错误代码。只需使用图书馆。 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); 
    } 
} 
0

可以使用GSON或Jackson Java库来解析JSON来鸣叫对象。他们是从json生成pojo的在线工具,您可以使用jackson将json字符串解析为对象。

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

那么编写你自己的解析器将是一个重塑车轮类型的任务。但如果您的需要是编写您自己的解析器,请参阅github上的杰克逊项目,以获取设计和维护方面的灵感。 这将帮助您制作一个通用应用程序。

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