我有许多串联在一起的json对象,需要解析所有对象。简单的例子:
String jsonStr = "{"name":"peter","age":40}{"name":"laura","age":50}"
使用杰克逊的ObjectMapper
进行解析时,它会正确找到并读取第一个json,然后删除其余字符串。
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonStr);
System.out.println(rootNode);
给出输出{"name":"peter","age":20}
是否有任何方式(在Jackson或其他框架中)例如返回读取的字符数,字符串的其余部分或JsonNode
s的数组?
我在JavaScript和Python中发现了具有相同目标的问题,建议通过}{
或正则表达式将其重新格式化为json数组,但我仍然希望以获得更优雅的解决方案。
答案 0 :(得分:2)
在Json中,对象结构以{
开始,以}
结尾。因此,ObjectMapper认为一旦遇到}
,就没有其他要处理的东西了。
在Json中,数组用[]
表示。因此,如果您希望有多个元素/对象,则需要用[]括起来,并用逗号分隔各个对象
"[
{"name":"peter","age":40},
{"name":"laura","age":50}
]"
答案 1 :(得分:2)
您不需要按照其他人的建议修改输入,只需使用以下代码即可。
主要方法
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());
}
}
人员班
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;
}
}
config.json文件
{"name":"peter","age":40}{"name":"laura","age":50}
程序输出
peter: 40
laura: 50
已使用的库
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
答案 2 :(得分:0)
您可以用方括号[]
包装输入,然后用}{
替换每个},{
,最后将字符串解析为数组:
String input = "{\"name\":\"peter\",\"age\":40}{\"name\":\"laura\",\"age\":50}"
String jsonArray = "[" + input.replace("}{", "},{") + "]";
ObjectMapper mapper = new ObjectMapper();
JsonNode parsedJsonArray = mapper.readTree(jsonArray);
答案 3 :(得分:0)
您必须修改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);
}
第三种无需数组即可直接解析的方法
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;
}
第四种方式
List<User> userList = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, User.class));