2015-10-15 2 views
0

Мне нужно преобразовать следующую строку в json-формат.Как преобразовать следующую строку в Json с помощью Java?

Ниже представлен входной сигнал, а также ожидаемый выход для справки.

Вход:

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

Предполагая, что оно отформатировано. Извините, что забудьте пропустить одну вещь ... Кроме того, она также должна учитывать пространство. Например, если следующее число приходит в одной строке. Номер Emp: First Class: должен возвращать json как {Emp Number:, First Class}. прямо сейчас он ошибочно приходит как «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" 
} 

EDIT: В соответствии с Вашим комментарием:

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

Спасибо за выражение..Извините, что забудьте пропустить одну вещь .. он должен также рассмотреть пространство ... например, если следующее приходит в одной строке. Номер Emp: First Class: должен возвращать json как {Emp Number:, First Класс} .прямо сейчас он ошибочно приходит как «Emp Number»: «Первый» в json-выходе –

+0

@KathiresanJeyapandian: Будут ли такие ключевые значения, как «Employee Nbr',' Employee Type »? Вы можете использовать их как маркеры. – npinti

+0

Да, значения ключей всегда будут там .... –

Смежные вопросы