У меня есть несколько 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}
Есть ли способ (в Джексоне или другой структуре), например возвращая количество прочитанных символов или остальную часть строки или массив из JsonNode s?
Я нашел вопросы с той же целью в JavaScript и на Python, где было рекомендовано разделить на }{ или regex, чтобы переформатировать это в массив json, но я все еще надеюсь на более элегантное решение.
вы должны изменить свой JSON
String jsonStr = "[{\"name\":\"peter\",\"age\":40},{\"name\":\"laura\",\"age\":50}]";
Существует несколько способов преобразования JSON в объект java.
1st Way
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;
}
2nd Пути // проверяют также импорт
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;
}
4th way
List<User> userList = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, User.class));
Вы можете скопировать вход с помощью скобок [], а затем заменить каждый }{ на },{, а затем, наконец, разобрать строку как массив:
String input = "{\"name\":\"peter\",\"age\":40}{\"name\":\"laura\",\"age\":50}"
String jsonArray = "[" + input.replace("}{", "},{") + "]";
ObjectMapper mapper = new ObjectMapper();
JsonNode parsedJsonArray = mapper.readTree(jsonArray);
В Json структура объекта начинается с { и заканчивается на }. Следовательно, ObjectMapper думает, что больше не нужно обрабатывать, как только он сталкивается с }.
В Json массив обозначается []. Поэтому, если вы хотите иметь несколько элементов / объектов, они должны быть заключены в [] и запятая, разделяющая отдельные объекты
"[
{"name":"peter","age":40},
{"name":"laura","age":50}
]"