2017-06-29 92 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