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

在Java中解析连接在一个字符串中的所有JSON,java,json,jackson,Java,Json,Jackson,我将许多json对象连接成一个字符串,需要解析所有这些对象。简单的例子: String jsonStr = "{"name":"peter","age":40}{"name":"laura","age":50}" 当使用jackson的ObjectMapper来解析这个时,它会正确地查找并读取第一个json,并删除字符串的其余部分 ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.r

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

String jsonStr = "{"name":"peter","age":40}{"name":"laura","age":50}"
当使用jackson的
ObjectMapper
来解析这个时,它会正确地查找并读取第一个json,并删除字符串的其余部分

ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonStr);
System.out.println(rootNode);
给出输出
{“name”:“peter”,“age”:20}

(在Jackson或其他框架中)是否有任何方法可以返回读取字符数、字符串的其余部分或
JsonNode
s数组


我在和中发现了具有相同目标的问题,其中建议使用
}{
或regex进行拆分,以将其重新格式化为json数组,但我仍然希望找到更优雅的解决方案。

在json中,对象结构以
{
开头,以
}结尾
。因此ObjectMapper认为,一旦遇到
}
,就没有什么需要处理的了

在Json中,数组用
[]
表示。因此,如果希望有多个元素/对象,则需要使用[]和分隔单个对象的逗号将其括起来

"[
  {"name":"peter","age":40},
  {"name":"laura","age":50}
]"

您可以将输入用括号括起来
[]
,然后将每个
}{
替换为
},{
,最后将字符串解析为数组:

String input = "{\"name\":\"peter\",\"age\":40}{\"name\":\"laura\",\"age\":50}"
String jsonArray = "[" + input.replace("}{", "},{") + "]";

ObjectMapper mapper = new ObjectMapper();
JsonNode parsedJsonArray = mapper.readTree(jsonArray);

您必须修改JSON

String jsonStr = "[{\"name\":\"peter\",\"age\":40},{\"name\":\"laura\",\"age\":50}]";
有多种方法可以将JSON转换为java对象

第一路

public JsonNode convertIntoJsonNode(String jsonStr)
    {
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = null;
        try {
            rootNode = objectMapper.readTree(jsonStr);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return rootNode;
    }
第二条路 //还检查导入

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
// User Model
    class User{
        private String name;
        private Integer age;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "User [name=" + name + ", age=" + age + "]";
        }
    }
//Coversion Method
public List<User> convertIntoObject(String jsonStr)
    {
        ObjectMapper objectMapper = new ObjectMapper();
        User[] myObjects = null;
        try {
            myObjects = objectMapper.readValue(jsonStr, User[].class);


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return Arrays.asList(myObjects);
    }
import java.io.IOException;
导入java.util.array;
导入java.util.List;
导入com.fasterxml.jackson.databind.JsonNode;
导入com.fasterxml.jackson.databind.ObjectMapper;
//用户模型
类用户{
私有字符串名称;
私人整数年龄;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数期限){
这个。年龄=年龄;
}
@凌驾
公共字符串toString(){
返回“User[name=“+name+”,age=“+age+”]”;
}
}
//转换法
公共列表CONVERTINTOBJECT(字符串jsonStr)
{
ObjectMapper ObjectMapper=新的ObjectMapper();
用户[]myObjects=null;
试一试{
myObjects=objectMapper.readValue(jsonStr,User[].class);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回array.asList(myObjects);
}
第三种方法可以直接解析而不使用数组

public List<User> convertIntothirdway(String jsonStr)
    {
        ObjectMapper objectMapper = new ObjectMapper();
        List<User> userList = null;
        try {
             userList = objectMapper.readValue(jsonStr, new TypeReference<List<User>>(){});
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return userList;
    }
公共列表转换为第三种方式(字符串jsonStr)
{
ObjectMapper ObjectMapper=新的ObjectMapper();
List userList=null;
试一试{
userList=objectMapper.readValue(jsonStr,newtypereference(){});
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回用户列表;
}
第四条路

List<User> userList = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, User.class));
List userList=mapper.readValue(jsonInput,mapper.getTypeFactory().constructioncollectiontype(List.class,User.class));

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

主要方法

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());
    }
}
peter: 40
laura: 50
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.5</version>
</dependency>
config.json文件

{"name":"peter","age":40}{"name":"laura","age":50}
程序输出

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());
    }
}
peter: 40
laura: 50
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.5</version>
</dependency>
使用的库

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());
    }
}
peter: 40
laura: 50
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.5</version>
</dependency>

com.fasterxml.jackson.core
杰克逊数据绑定
2.9.5

只需附加一个
]
并在前面加上一个
[
,然后将其作为数组读取
[{“name”:“peter”,“age”:40},{“name”:“劳拉”,“age”:50}]
使用这种方法。@Lino仍然,您需要在json对象之间添加逗号。我无法控制输入,必须按原样对其进行分析。方括号很简单,但以故障安全的方式插入逗号并不容易,并且会带来一些其他问题,如果可能的话,这就是我希望避免这种情况的原因。在此处插入逗号非常简单问题。当然有可能,但会使代码更难看,增加不必要的复杂性,这就是为什么我们会欣赏所描述的解决方案。当然有可能,但会使代码更难看,增加不必要的复杂性,这就是为什么我们会欣赏所描述的解决方案。2.方法在哪里?添加了第二种方法我不能不幸的是,请更改输入。如前所述,我不希望应用基于字符串替换或正则表达式的修改。请检查您的JSON是否为无效JSON。请检查给定链接上的josn@FaizAkram请求您仔细阅读问题,其中提到多个有效JSON对象被串联,他需要首先读取有效js此外,他还提到他知道一些需要替换的解决方案,但他不喜欢。很好,这让我走上了正确的道路,非常感谢。你是否碰巧知道如何处理不完整的数据(例如,输入
{“name”:“peter”,“age”:40}{“name”:“lau
)?已找到,这提供了一个不太好的解决方案,不幸的是。@Bastian35022为什么您的工作是修复无效数据?如果有人正在使用无效数据执行您的代码,那么它应该退出并抛出一个异常。@Lino由于TCP套接字上的数据传递,可能会出现不完整的数据,这是很常见的,无法避免的在TCP之上没有任何协议来将数据重组为完整的应用层数据包。如果数据不完整,我只需要等待更多数据到达,或者在连接中断时丢弃数据。然后就不需要尝试解析输入,因为您将等待或丢弃数据。这是一个实时应用程序,具有更强的灵活性tency要求比普通web应用程序更高。应尽快解析和处理完整的json对象,但可能会出现获取部分json对象的情况,需要解决。