在 Java 中解析一个字符串中连接的所有 json

Bas*_*022 3 java json jackson

我有许多 json 对象连接成一个字符串,并且需要解析所有这些对象。简单的例子:

String jsonStr = "{"name":"peter","age":40}{"name":"laura","age":50}"
Run Code Online (Sandbox Code Playgroud)

当使用ObjectMapperjackson 解析这个时,它会正确地找到并读取第一个 json,并删除字符串的其余部分。

ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonStr);
System.out.println(rootNode);
Run Code Online (Sandbox Code Playgroud)

给出输出 {"name":"peter","age":20}

有没有办法(在杰克逊或其他框架中)例如返回读取字符的数量,或字符串的其余部分,或JsonNodes的数组?

我在JavaScriptPython 中发现了具有相同目标的问题,建议使用 split by}{或 regex 将其重新格式化为 json 数组,但我仍然希望有一个更优雅的解决方案。

Pra*_*tel 5

您不需要按照其他人的建议修改您的输入,只需使用以下代码即可。

主要方法

public static void main(String[] args) throws IOException {

    ObjectMapper mapper = new ObjectMapper();
    JsonFactory factory = new JsonFactory(mapper);

    JsonParser parser = factory.createParser(new File("config.json"));
    // factory.createParser(String) and many other overload methods
    // available, byte[], char[], InputStream etc.

    Iterator<Person> persons = parser.readValuesAs(Person.class);
    while(persons.hasNext()) {
        Person p = persons.next();
        System.out.printf("%s: %d%n", p.getName(), p.getAge());
    }
}
Run Code Online (Sandbox Code Playgroud)

人物类

public class Person {

    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}  
Run Code Online (Sandbox Code Playgroud)

config.json 文件

{"name":"peter","age":40}{"name":"laura","age":50}
Run Code Online (Sandbox Code Playgroud)

程序输出

peter: 40
laura: 50
Run Code Online (Sandbox Code Playgroud)

使用的库

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.5</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)