Разбор всех jsons, которые объединены в одну строку в Java

У меня есть несколько 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, но я все еще надеюсь на более элегантное решение.

0
задан 13 August 2018 в 14:03

3 ответа

вы должны изменить свой 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));
0
ответ дан 15 August 2018 в 17:04
  • 1
    где 2-й путь? – Lino 13 August 2018 в 14:34
  • 2
    добавлен второй способ – Faiz Akram 13 August 2018 в 14:36
  • 3
    К сожалению, я не могу изменить ввод. И, как описано, я бы предпочел не применять модификации на основе строки или на основе регулярных выражений. – Bastian35022 13 August 2018 в 14:40
  • 4
    хорошо, дайте мне попробовать другой путь – Faiz Akram 13 August 2018 в 14:43
  • 5
    проверьте JSON, который недействителен JSON. проверьте josn по заданной ссылке jsonformatter.curiousconcept.com – Faiz Akram 13 August 2018 в 15:04

Вы можете скопировать вход с помощью скобок [], а затем заменить каждый }{ на },{, а затем, наконец, разобрать строку как массив:

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

ObjectMapper mapper = new ObjectMapper();
JsonNode parsedJsonArray = mapper.readTree(jsonArray);
0
ответ дан 15 August 2018 в 17:04
  • 1
    Конечно, это возможно, но делает код более уродливым и добавляет излишнюю сложность, поэтому решение, как описано, будет оценено по достоинству. – Bastian35022 13 August 2018 в 14:23

В Json структура объекта начинается с { и заканчивается на }. Следовательно, ObjectMapper думает, что больше не нужно обрабатывать, как только он сталкивается с }.

В Json массив обозначается []. Поэтому, если вы хотите иметь несколько элементов / объектов, они должны быть заключены в [] и запятая, разделяющая отдельные объекты

"[
  {"name":"peter","age":40},
  {"name":"laura","age":50}
]"
2
ответ дан 15 August 2018 в 17:04
  • 1
    Вставка запятой здесь является проблемой. Конечно, это возможно, но делает код более уродливым и добавляет излишнюю сложность, поэтому решение, как описано, будет оценено по достоинству. – Bastian35022 13 August 2018 в 14:23

Другие вопросы по тегам:

Похожие вопросы: