2013-08-29 71 views
1

我正在寫一個簡單的解析器來將包含name=value對中的條目的java屬性文件轉換爲json字符串。 以下是代碼。本規則要求每個條目是在一個新的生產線:當有屬性文件中多餘的空行新將Java屬性文件轉換爲JSON字符串

 sCurrentLine = br.readLine(); 
     while ((sCurrentLine) != null) 
     {       
       config+=sCurrentLine.replace('=', ':'); 
       sCurrentLine = br.readLine() 
       if(sCurrentLine!=null) 
       config+=","; 
     } 
     config+="}"; 

功能正常工作的情況除外。 (例如:假設我在道具文件中寫入最後一個條目,然後點擊兩個輸入,該文件將在最後一個條目之後包含兩個空的新行)。雖然預期的輸出爲{name1:value1,name2:value2},但在上述情況下,當出現額外的新行時,我會得到輸出爲{name1:value1,name2:value2,}。尾隨,的數量隨着空行數的增加而增加。

我知道它是因爲readLine()讀取空行而邏輯上它不應該但我該如何改變?

+0

它是無用的分析屬性文件,因爲Java可以讀取它們[開箱](http://stackoverflow.com/questions/8285595/reading-properties-file-in- JAVA)。並且[這裏](https://github.com/douglascrockford/JSON-java/pull/82)是從屬性對象生成JSON的代碼。 – ceving

回答

2

這可以使用方法解決。只需確保在你的線上"="的存在..

while ((sCurrentLine) != null) 
    { 
      if(sCurrentLine.contains("=") {       
       config+=sCurrentLine.replace('=', ':'); 
       sCurrentLine = br.readLine() 
       if(sCurrentLine!=null) 
        config+=","; 
      } 
    } 

sCurrentLine = "name=dave" 
if(sCurrentLine.contains("=")) // Evaluates to true. 
     // Do logic. 

sCurrentLine = "" 
if(sCurrentLine.contains("=")) // Evaluates to false. 
    // Don't do logic. 

sCurrentLine = "\n" 
if(sCurrentLine.contains("=")) // Evaluates to false. 
    // Don't do logic. 

我知道它,因爲的readLine()讀取空行,而在邏輯上不應該,但我該如何改變這一點?

readLine()讀取的內容最多可達\n。這就是它可以檢查一條新線路的方法。你之前沒有\n,因此你的線路將包含"",因爲省略了\n

輕度強化

如果你想確保你的線肯定有一個名稱,並在它的屬性,那麼你可以使用一些簡單的正則表達式。

if(s.CurrentLine.matches("\\w+=\\w+")) 
// Evaluates to any letter, 1 or moe times, followd by an "=", followed by letters. 
+0

工作很好,謝謝。 – Aneesh

+0

感謝您的加強太需要了。似乎無法想象這些天。 – Aneesh

+0

正則表達式應該是「\\ w + = \\ w +」'正確嗎? – Aneesh

1

的一種方式是使用方法trim()的檢查是當前行空或不:

sCurrentLine = br.readLine(); 
    while ((sCurrentLine) != null) 
    {       
      If ("".equals(sCurrentLine.trim()) == false) 
      { 
      config+=sCurrentLine.replace('=', ':'); 
      sCurrentLine = br.readLine() 
      if(sCurrentLine!=null) 
      config+=","; 
      } 
    } 
    config+="}"; 
1

下面的代碼將檢查正則表達式空行。這也應該做

if (sCurrentLine != null){ 
      if (!sCurrentLine.matches("^\\s*$")) // matches empty lines 
        config += ","; 
     }