Распарсить массив json в составе json

91
08 марта 2022, 23:20

Имею массив json в составе большого json. Использую jackson. Помогите пожалуйста распарсить. Пример ниже.

Input:

{"ОБЪЕКТ":"ДОМ","ВРЕМЯ":"12:00","КОМНАТА":{"КОРОБКА":[{"НАЗВАНИЕ":"ПО_01","РАЗМЕР":"0.0.1"}{"НАЗВАНИЕ":"ПО_02","РАЗМЕР":"2.0.1"}...{"НАЗВАНИЕ":"N","РАЗМЕР":"N"}]}"НОМЕР":"1"}

Output:

{"ОБЪЕКТ":"ДОМ","ВРЕМЯ":"12:00","НАЗВАНИЕ":"ПО_01","РАЗМЕР":"0.0.1","НОМЕР":"1"}
{"ОБЪЕКТ":"ДОМ","ВРЕМЯ":"12:00","НАЗВАНИЕ":"ПО_02","РАЗМЕР":"2.0.1","НОМЕР":"1"}
...
{"ОБЪЕКТ":"ДОМ","ВРЕМЯ":"12:00","НАЗВАНИЕ":"N","РАЗМЕР":"N","НОМЕР":"1"}
public class MessageCv3 implements Jsonable {
    static String json = "{\"OBJECT\": \"HOUSE\", \"TIME\": \"12:00\", \"ROOM\": {\"BOX\": [{\"TITLE\": \"BY_01\", \"SIZE\": \"0.0.1\"} {\" NAME \":\" PO_02 \",\" SIZE \":\" 2.3.1 \"}]},\" NUMBER \":\" 1 \"}";
    private String OBJECT;
    private String TIME;
    private Map<String,String> ROOM = new HashMap<>();
    private List<String> BOX = new ArrayList<>();
    private String TITLE;
    private String SIZE;
    private String NUMBER;
    public String getOBJECT() {return OBJECT;}
    public void setOBJECT(String OBJECT) {this.OBJECT = OBJECT;}
    public String getTIME() {return TIME;}
    public void setTIME(String TIME) {this.TIME = TIME;}
    public Map<String, String> getROOM() {return ROOM;}
    public void setROOM(Map<String, String> ROOM) {this.ROOM = ROOM;}
    public List<String> getBOX() {return BOX;}
    public void setBOX(List<String> BOX) {this.BOX = BOX;}
    public String getTITLE() {return TITLE;}
    public void setTITLE(String TITLE) {this.TITLE = TITLE;}
    public String getSIZE() {return SIZE;}
    public void setSIZE(String SIZE) {this.SIZE = SIZE;}
    public String getNUMBER() {return NUMBER;}
    public void setNUMBER(String NUMBER) {this.NUMBER = NUMBER;}
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        MessageCv3 out = mapper.readValue(json,MessageCv3.class);
        System.out.println(out);
    }
}
Answer 1

Не обязательно создавать отдельный класс для json. Можно парсить его в Map.

Пример разбора папки с файлами json, вывод в консоль и запись в другую папку. Адаптировал под под ваш случай. Условие - структура json не должна меняться.

public class JsonConcatenation {
    public static void main(String[] args) {
        JsonConcatenation jsonConcatenation = new JsonConcatenation();
        // Read json
        HashMap<String, Object> jsonMap = jsonConcatenation.findJson("json");
        jsonMap.forEach((name, json) -> {
            HashMap<String, Object> room =
                    (HashMap<String, Object>) ((HashMap)json).get("КОМНАТА");
            ArrayList<HashMap<String, Object>> boxes =
                    (ArrayList<HashMap<String, Object>>) room.get("КОРОБКА");
            boxes.forEach(box -> {
                ((HashMap)json).remove("КОМНАТА");
                box.forEach(((HashMap) json)::put);
                // Print json
                System.out.println(json);
                // Write json
                jsonConcatenation
                        .writeJson((HashMap) json, name, boxes.indexOf(box));
            });
        });
    }
    //////// //////// //////// //////// //////// //////// //////// ////////
    public HashMap<String, Object> findJson(String address) {
        File[] files = findFiles(address);
        HashMap<String, Object> jsonMap = new HashMap<>();
        if (files.length > 0) {
            ObjectMapper mapper = new ObjectMapper();
            Stream.of(files).filter(file ->
                    file.getName().contains(".json")).forEach(file -> {
                try {
                    Object dto = mapper.readValue(file, HashMap.class);
                    jsonMap.put(file.getName().replace(".json", ""), dto);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }
        return jsonMap;
    }
    private File[] findFiles(String address) {
        File[] fileArr = null;
        URL url = JsonConcatenation.class.getResource(address);
        if (url == null) {
            return new File[]{};
        }
        File folder = new File(url.getFile());
        if (folder.isDirectory()) {
            fileArr = folder.listFiles();
        }
        return fileArr;
    }
    private void writeJson(HashMap json, String name, Integer index) {
        ObjectMapper mapper = new ObjectMapper();
        ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());
        try {
            writer.writeValue(new File(name + index + "-new.json"), json);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
READ ALSO
getReader() и getInputStream() в веб приложении

getReader() и getInputStream() в веб приложении

Столкнулась с проблемой что нельзя одновременно у одного request вызвать и getReader(), и getInputStream(), в документации написано что нельзя и на практике...

201
Как считать xml-файл в String, оставляя пробелы,но удаляя переносы строк?

Как считать xml-файл в String, оставляя пробелы,но удаляя переносы строк?

Как считать xml-файл полностью в String, оставляя пробелы,но удаляя переносы строк?

101
No bean named &#39;entityManagerFactory&#39; available при тестировании в Spring Boot

No bean named 'entityManagerFactory' available при тестировании в Spring Boot

подскажите пожалуйста как решить данную проблему, в интернете решения не помоглиВывод консоли при тестировании:

91
Приложение вылетает при использовании AsyncTask&lt;&gt; Android

Приложение вылетает при использовании AsyncTask<> Android

Пишу приложение на Android Studio конвертер валют, но столкнулся с проблемойПриложение вылетает при нажатии на кнопку "рассчитать"

97