用于从数组中提取JSON对象的正则表达式

a1o7rhls  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(124)

我正在用Java编写一个自定义JSON反序列化器,希望创建一个ArrayList对象,这些对象在.json文件中指定。

[
    {
        "name": "User1",
        "gender": "M"
    },
    {
        "name": "User2",
        "gender": "F"
    }
]

(...)我希望Java程序创建一个包含User类的两个对象的结构,每个对象包含相应的字段。
我设法只使用文件中提到的一个值(因此没有JSON数组,只有{}和一些键-值对之间的一个对象),但使用列表会变得更复杂。考虑将整个JSON数组拆分为所有元素,并对每个元素应用我的单个JSON解析算法,然后将它们添加到ArrayList中。
我的想法应该可行,但问题是,我不太确定如何使用Java的split()方法正确地拆分JSON数组,我也不太擅长正则表达式,无法找到合适的表达式。
考虑根据以下因素进行拆分:content.split("},"),然后将最后一个}附加到最后一个元素,但如果JSON元素引用其他对象,这也将在JSON元素的成员内部进行拆分。
我的问题是,在这个上下文中,什么是一个合适的正则表达式,它将使Java正确地将JSON数组拆分为多个JSON元素?
我可以删除文件开头和结尾的括号,这应该不是问题,因为它只需要简单的字符串操作,但我还需要一个String[]数组,每个数组包含我的两个用户中的一个,以及他们的数据。
预期输出:

String1: { "name": "User1", "gender": "M" }
String2: { "name": "User2", "gender": "F" }
ubof19bj

ubof19bj1#

如果它的格式与您的问题相符,您可以用途:

(?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"}

相关问题