2013-12-12 34 views
2

我不知道,如果是可以做到的,但我想解析一個非常簡單的JSON文件到字符串數組。使用正則表達式來分析一個非常簡單的JSON文件

示例文件:

["String1", "String2", "oneMoreString"] 

到目前爲止,我想我會用掃描儀用一個模式來得到我的輸出,但沒能做到這一點。

ArrayList<String> strings = new ArrayList<String>(); 
    File f = new File("src/sample.txt"); 
    String pattern = "\\s*[\"\"]\\s*"; 
    try { 
     InputStream is = new FileInputStream(f); 
     Scanner s = new Scanner(is); 
     s.useDelimiter(pattern); 
     while (s.hasNext()){ 
      strings.add(s.next()); 
     } 
     s.close(); 
     is.close(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

因爲該模式顯然是錯誤的,因爲它認爲「」因爲它適合,但我想它不會被列入...:S

我也接受建議,可以任何其他方式工作,這可以解析。也許是一個JSON解析器?但由於文件太簡單了,我認爲沒有必要。

+3

你可以看看GSON解析器http://code.google.com/p/google-gson/ – Sach

+0

得到了我的路徑http://jackson.codehaus.org/,但似乎矯枉過正使用JSON解析器... – Daren

+2

@達人,不,根本不會矯枉過正(使用傑克遜/吉森)。引入10行以上的正則表達式代碼來處理簡單的JSON字符串不是要走的路(IMO)。 –

回答

3

最好是使用JSON解析器像傑克遜映射到JSON字符串解析。

但是,如果你有一個簡單的字符串,你可以快速使用一個樣本正則表達式給它。

嘗試了這一點:

String str = "[\"String1\", \"String2\", \"oneMoreString\"]"; 

    Pattern pattern = Pattern.compile("\"(.+?)\""); 
    Matcher matcher = pattern.matcher(str); 

    List<String> list = new ArrayList<String>(); 
    while (matcher.find()) { 
     // System.out.println(matcher.group(1));. 
     list.add(matcher.group(1)); 
    } 
+0

匹配器只檢測字符串,而不是輸入流...你可以用掃描儀試試嗎?對我來說這似乎沒有工作.. thnx! – Daren

+0

可以使用的FileInputStream讀取數據讀取數據流,然後將它傳遞給匹配。 –

+0

之前你建議它,它的工作原理。謝謝。 – Daren

-1

,而不是分析它像上面你可以使用任何可用的Java JSON解析器

+0

我知道,除了我不瞭解reg-exp的情況之外,有什麼理由這麼做?在我看來,似乎矯枉過正。 – Daren

+0

考慮這種方式,您解析JSON(JavaScript對象符號),必須遵守一些規則,就像是一個鍵值對由{}包圍等。通常庫,例如GSON或傑克遜(上述)在此提供一些驗證方面避免了錯誤的json輸入,並且通常(我已經與兩個人一起工作)他們在性能上做得很好;如果你需要的話,還可以使用json lib爲你提供其他功能以便將來擴展。如果您擔心表現不佳,您可以通過編寫兩種方法並測量運行所需時間來進行基準測試,差異會很小。 – Fawix

1
//split by , 
String strings[] = s.split(","); 
//remove [ from first string 
strings[0] = strings[0].substring(1); 
//remove ] from last string 
String last = strings[strings.length - 1]; 
strings[strings.length - 1] = last.substring(0, last.length() - 1); 
+0

巧妙... xD不漂亮,但應該工作。 – Daren

+0

@Daren好,你想避免JSON解析器:) –

+0

會被作爲's.substring容易(1,s.length() - 1(也許2))。分裂( 「」)' –

3

看到你在classpath有傑克遜,只需做:

ObjectMapper mapper = new ObjectMapper(); 
String[] array = mapper.readValue("[\"String1\", \"String2\", \"oneMoreString\"]", String[].class); 
System.out.println(Arrays.toString(array)); 

將打印:

[String1, String2, oneMoreString] 
+0

我會接受他的解決方案(因爲問題有正則表達式),但使用你的,謝謝。得到我的讚賞。 – Daren

+0

沒問題,不用客氣。 –

相關問題