Я работаю над собственным десериализатором JSON на Java и хотел бы создать ArrayList
объектов, указанных в таком .json
файле. Например, для следующего файла:
[
{
"name": "User1",
"gender": "M"
},
{
"name": "User2",
"gender": "F"
}
]
(...) Я хочу, чтобы моя программа на Java создавала структуру из двух объектов класса User
, каждый из которых содержал бы соответствующие поля.
Мне удалось сделать это только с одним значением, упомянутым в файле (поэтому нет массива JSON, просто объект между {}
и некоторыми парами ключ-значение), но со списком все становится сложнее. Подумал о том, чтобы разбить весь массив JSON на все его элементы и применить мой единственный алгоритм разбора JSON к каждому из них, а затем добавить их в ArrayList
.
Моя идея должна работать, но моя проблема в том, что я не уверен, как правильно разбить этот массив JSON, используя метод Java split()
для строк. Я также не так хорош в выражениях регулярных выражений, чтобы думать о правильном.
Думал разделить его на основе: content.split("},")
, а затем добавить последний }
к последнему элементу, но это также приведет к разделению внутри членов моих элементов JSON, если они ссылаются на другие объекты.
Мой вопрос будет заключаться в том, что в этом контексте будет правильным регулярным выражением, которое заставит Java правильно разделить мой массив JSON на несколько элементов JSON?
Я могу удалить скобки в начале и в конце файла, это не должно быть проблемой, так как это требует только простых манипуляций со строками, но я также хочу массив String[]
, каждый из которых содержит одного из моих двух пользователей, вместе с их данные.
Ожидаемый результат:
String1: { "name": "User1", "gender": "M" }
String2: { "name": "User2", "gender": "F" }
перебирать строку, нажимать переднюю скобку всякий раз, когда она есть, и выталкивать ее всякий раз, когда есть задняя скобка. всякий раз, когда стек пуст, возвращайте подстроку до этой точки
@Icarus Это действительно было бы решением, а не решением. Но нельзя ли сделать это намного проще в REGEX?
Если он довольно отформатирован в соответствии с вашим вопросом, вы можете использовать:
(?s)(?<=^ )\{.*?(?<=^ )}
Вот некоторый тестовый код:
String input = "[\n" +
" {\n" +
" \"name\": \"User1\",\n" +
" \"gender\": \"M\"\n" +
" },\n" +
" {\n" +
" \"name\": \"User2\",\n" +
" \"gender\": \"F\"\n" +
" }\n" +
"]";
List<String> jsonObjects = Pattern.compile("(?sm)(?<=^ )\\{.*?(?<=^ )}")
.matcher(input).results()
.map(MatchResult::group)
.map(str -> str.replaceAll("[\s\n]*(?!\",)", "")) // remove whitespace
.collect(toList());
Вывод:
{"name":"User1","gender":"M"}
{"name":"User2","gender":"F"}
Разделение @Icarus запятой также разделит мои ключи, а я этого не хочу. Мне нужен массив String объектов JSON, а не ключей JSON