Преобразование плоского файла в JSON в Java

#java #json #flat-file

#java #json #плоский файл

Вопрос:

Мне нужно преобразовать плоский файл в файл JSON на Java.

Мой плоский файл выглядит следующим образом:

 customerInfo.firstName=abc
customerInfo.lastName=aaa
customerInfo.nickNames.0.name=bbb
customerInfo.nickNames.0.meaning=ccc
  

Вот фрагмент кода, который я использую:

 JSONParser parser = new JSONParser();
Object obj = null;
try {
    //obj = parser.parse(new FileReader("src/main/resources/flatfileex.txt"));
    JSONObject jsonObject = (JSONObject) parser.parse(new InputStreamReader(new FileInputStream("src/main/resources/flatfileex.txt")));;
    String flattenedJson = JsonFlattener.flatten(jsonObject.toJSONString());
    System.out.println(flattenedJson);
} catch (FileNotFoundException | IOException | ParseException e) {
    e.printStackTrace();
}
  

Я использую зависимость jsonflattener для приведенного выше кода:

 <dependency>
    <groupId>com.github.wnameless</groupId>
    <artifactId>json-flattener</artifactId>
    <version>0.1.0</version>
</dependency>
  

Получение ошибки при разборе файла с неожиданным символом [c] в позиции 0. Как это решить?

Комментарии:

1. Извините, но ваш ВВОД не является json. Почему вы хотите использовать анализатор JSON для чтения ввода, отличного от json? Это обычный текст. Вам нужно написать код для его синтаксического анализа в соответствии с «семантикой», которая встроена в ваш собственный «формат» в текстовом файле. Затем вы можете создавать JSONObjects из этих объектов и записывать их как JSON.

2. @GhostCat Есть ли какой-либо способ преобразовать плоский файл в json, то есть текстовый файл в json без использования objectmapper и некоторой схемы объектов скелета?

3. Если бы у вас был плоский файл, вы могли бы проанализировать его с помощью чего-то вроде jFFP, а затем приступить к сериализации его с помощью Jackson или чего-то еще, чтобы получить JSON, но у вас нет плоского файла. У вас какой-то странный набор свойств, поэтому первое, что приходит на ум java.util.Properties , но тогда вы получите переменные с именами 0 , которые невозможны в Java из-за соглашений об именовании. Короче говоря, ваши входные данные — это мусор, и именно поэтому обмен данными осуществляется в таких форматах, как XML или JSON, чтобы избежать бессмысленного синтаксического анализа. Вероятно, вам придется написать пользовательский синтаксический анализатор для десериализации.

4. И затем, когда у вас есть правильное представление объекта Java для вашего ввода, вы можете перейти к следующему шагу — сериализации в JSON.

Ответ №1:

Ваш входной файл выглядит как файл свойств Java, поэтому вы можете попробовать это:

 Properties prop = new Properties();
try (InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("content.txt")){
    prop.load(inputStream);
    String contentAsJson = new ObjectMapper().writeValueAsString(prop);
    System.out.print(contentAsJson);
} catch (IOException exception) {
    System.out.println("Something went wrong!");
}
  

Если ваш файл содержит

 customerInfo.firstName=abc
customerInfo.lastName=aaa
customerInfo.nickNames.0.name=bbb
customerInfo.nickNames.0.meaning=ccc
  

Он будет печатать

 {"customerInfo.lastName":"aaa","customerInfo.firstName":"abc","customerInfo.nickNames.0.name":"bbb","customerInfo.nickNames.0.meaning":"ccc"}
  

Я думаю, что отсюда вы можете использовать json-flattener .

Комментарии:

1. Как насчет имен переменных 0 ? Он взорвется, как только вы десериализуете его в объект, который он представляет. Если вы хотите пойти по этому пути, он уже должен быть сохранен в JSON в виде массива, чтобы не вызывать проблем в будущем.

2. customerInfo.nickNames.0.name я хочу преобразовать его в массив json, а не в свойство

3. Действительно ли они хотят, чтобы POJO представлял это? AFAIT вопрос в том, как преобразовать этот ввод в JSON.

4. О, похоже, то, что вы хотите, — это что-то для unflatten вашего JSON. Вы можете использовать JsonUnflattener.unflatten для этого.

5. unflatten сделает свое дело, если вы замените в contentAsJson на регулярное выражение .(d ) . с помощью [$ 1].