2015-09-25 2 views
1

Я разбираю один файл конфигурации с помощью Java и Regex.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 и т.д ..))

EDIT:

Я пытался обновить Regex по рекомендации:

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 и Regex «_ - это тот файл, который вы показываете в своем вопросе? Если нет, можете ли вы показать этот файл? –

+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); 
Смежные вопросы