在Java中解析连接在一个字符串中的所有JSON
我将许多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
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对象的情况,需要解决。