2015-09-25 61 views
1

我正在使用Java和正則表達式解析一個配置文件。Java - 如何修復格式不正確的JSON?

在此之後,我得到以下格式的字符串ArrayList。

enter image description here

,我想從例如獲得上述有效的JSON:

{ 
    "ssid": "test1", 
    "psk": "154695", 
    "key_mgmt": "WPA-PSK", 
    "sim_slot": "-1", 
    "imsi": "none", 
    "priority": 1 
} 

我如何能做到這一點在任何簡單的方法嗎?任何這個庫? (我一定不能是JSON我可以接受任何其他格式(XML,CSV,等..))

編輯:

我試圖通過建議更新正則表達式:

while (m.find()) { 
        String foundOccurence = m.group(); 
        foundOccurence = foundOccurence.replace("=",":"); 
        foundOccurence = foundOccurence.replaceAll("\\s*([^:]+):(.*(\\n|$))","\"$1\":$2"); 
        allMatches.add(foundOccurence); 
       } 

但結果仍然是無效的(但幾乎是),見下圖:

enter image description here

+0

傑克遜能爲你做了很多(特別是其分析器允許密鑰不被字符串文字),但作爲_values_這是不符合... – fge

+0

所以,我很清楚,你說_」我正在使用Java和正則表達式解析一個配置文件「_ - 是你在問題中顯示的文件嗎?如果沒有,你能顯示那個文件嗎? –

+0

@SeanBright:看看前面的OP的問題,那裏有更多的上下文。 –

回答

0

這是一個有點難以取消了解你真正需要的東西。

從這個輸入字符串:

{ 
    ssid:"test1" 
    psk:"test154695" 
    key_mgmt:WPA-PSK 
    sim_slot:"-1" 
    imsi:"none" 
    priority:1 
} 

看來要得到這個輸出字符串:

{ 
    "ssid": "test1", 
    "psk": "test154695", 
    "key_mgmt": "WPA-PSK", 
    "sim_slot": "-1", 
    "imsi": "none", 
    "priority": 1 
} 

我看到的差異:

  • 添加雙引號鍵值,
  • 添加雙引號的key_mgmt值,轉向WPA-PSK"WPA-PSK"
  • 添加一個空格後:
  • 每個值後面添加一個逗號,除了最後一個

這裏有一個實現,做到這一點,並驗證。 我希望這是你正在尋找的, 或基於此你將能夠弄清楚。

String malformed = "{\n" + 
      " ssid:\"test1\"\n" + 
      " psk:\"test154695\"\n" + 
      " key_mgmt:WPA-PSK\n" + 
      " sim_slot:\"-1\"\n" + 
      " imsi:\"none\"\n" + 
      " priority:1\n" + 
      "}"; 

    String expected = "{\n" + 
      " \"ssid\": \"test1\",\n" + 
      " \"psk\": \"test154695\",\n" + 
      " \"key_mgmt\": \"WPA-PSK\",\n" + 
      " \"sim_slot\": \"-1\",\n" + 
      " \"imsi\": \"none\",\n" + 
      " \"priority\": 1\n" + 
      "}"; 

    Pattern p = Pattern.compile("(\\w+):([^\\n]*)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
    Matcher m = p.matcher(malformed); 
    StringBuilder builder = new StringBuilder("{\n"); 
    while (m.find()) { 
     String key = m.group(1); 
     String value = m.group(2); 
     if (key.equals("key_mgmt")) { 
      value = "\"" + value + "\""; 
     } 
     builder.append(String.format(" \"%s\": %s,\n", key, value)); 
    } 
    builder.replace(builder.length() - 2, builder.length(), "\n}"); 
    String corrected = builder.toString(); 

    assert expected.equals(corrected);