2015-10-15 23 views
0

我需要將以下字符串轉換爲json格式。如何使用Java將以下字符串轉換爲Json?

下面是輸入以及預期輸出供參考。

輸入:

Employee Driver Report - EDR 
-------------------------------- 
Employee Nbr: 123480 Employee Type: DI Cat: UPL 
Driver License: PP3P30 Plate: ROWP 
Part Number: 1006096 

輸出:

{ 
"Employee Nbr": "123480", 
"Employee Type": "DI", 
"Cat": "UPL", 
"Driver License": "PP3P30", 
"Plate": "ROWP", 
"Part Number": "1006096", 
} 

示例代碼:

Map<String, String> keyValueMap = new HashMap<String, String>(); 
String[] lines = rawText.split(System.getProperty("line.separator")); 
for(String line: lines) { 
....... 
    keyValueMap.put(keyAndValues[i], keyAndValues[i + 1]); 
} 
Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
String json = gson.toJson(keyValueMap); 

能否請你幫我如何解決這個問題?

在此先感謝。

+1

你的規格有點缺失;例如,我們如何確定它是「Employee Nbr」:「123480」,「員工類型」:「DI」,而不是「Employee Nbr」:「123480 Employee」,「Type」:「DI」 '?假設格式正確的文件和每個值只有一個單詞,我會用空格拆分,收集單詞,直到以':'結尾,使用集合作爲鍵,然後將下一個單詞作爲值,並重復直到一切都被消耗了。 –

+0

假設它已更正格式。對不起,忘了錯過一件事..也必須考慮空間以及..例如,如果以下單線行商號:第一類:應返回json作爲{商號::頭等艙}。現在它錯誤地作爲「Emp Number」出現:json輸出中的「第一個」 –

+0

感謝您提供其他規範信息;這使得使用正則表達式處理起來有些困難,儘管它可能可以完成(如果這是一個家庭作業問題,那麼您可能因爲太聰明或從互聯網上抓取而失去點!);如果我們回到用空格分割,如果收集鍵時,如果你得到一個,但在行上沒有剩餘單詞,則將當前鍵追加到前一個值的末尾。 –

回答

1

對於每個line,您必須使用:(空格)作爲分隔符來解析它。

我會讓你尋找正確的正則表達式使用,如果需要尋求幫助;)

0

你可以使用像這樣的表達式:)([\w\s]+\s*):\s*([\w]+)(例如here來處理數據。該表達式假定您的值參數中沒有空白。

因此給出下面的代碼:

String source = "Employee Driver Report - EDR\n" + 
        "--------------------------------\n" + 
        "Employee Nbr: 123480 Employee Type: DI Cat: UPL\n" + 
        "Driver License: PP3P30 Plate: ROWP\n" + 
        "Part Number: 1006096"; 

    String[] lines = source.split("\n"); 
    Pattern p = Pattern.compile("([\\w\\s]+\\s*):\\s*([\\w]+)"); 
    System.out.println("{"); 
    for(int i = 2; i < lines.length; i++) 
    { 
     Matcher m = p.matcher(lines[i]); 
     while(m.find()) 
     {     
      System.out.println("\"" + m.group(2).trim() + "\":" + "\"" + m.group(1).trim() + "\""); 
     } 
    } 
    System.out.println("}"); 

你會看到類似這樣:

{ 
"Employee Nbr":"123480" 
"Employee Type":"DI" 
"Cat":"UPL" 
"Driver License":"PP3P30" 
"Plate":"ROWP" 
"Part Number":"1006096" 
} 

編輯:按照您的評論:

String source = "Employee Driver Report - EDR\n" + 
        "--------------------------------\n" + 
        "Employee Nbr: 123480 With white space Employee Type: DI Cat: UPL\n" + 
        "Driver License: PP3P30 Plate: ROWP\n" + 
        "Part Number: 1006096"; 

    String[] lines = source.split("\n"); 
    Pattern p = Pattern.compile("(Employee Nbr|Employee Type|Cat|Driver License|Plate|Part Number)\\s*:\\s*(.+?)(?:(?=Employee Nbr|Employee Type|Cat|Driver License|Plate|Part Number)|$)"); 
    System.out.println("{"); 
    for(int i = 2; i < lines.length; i++) 
    { 
     Matcher m = p.matcher(lines[i]); 
     while(m.find()) 
     {     
      System.out.println("\"" + m.group(1).trim() + "\":" + "\"" + m.group(2).trim() + "\""); 
     } 
    } 
    System.out.println("}"); 

產量:

{ 
"Employee Nbr":"123480 With white space" 
"Employee Type":"DI" 
"Cat":"UPL" 
"Driver License":"PP3P30" 
"Plate":"ROWP" 
"Part Number":"1006096" 
} 

已更新的表達式的說明可用here

+0

感謝您的表達.Sryry忘記錯過一件事..它必須考慮空間以及..例如,如果以下單線行商號:第一類:應返回JSON爲{商號:第一Class}。現在它錯誤地以「Emp Number」的形式出現:json輸出中的「First」 –

+0

@KathiresanJeyapandian:「Employee Nbr」,「Employee Type」等關鍵值是否總是存在?你可以用它們作爲標記。 – npinti

+0

是的,關鍵值將永遠存在.... –

相關問題