#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].