Имею массив 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);
}
}
Не обязательно создавать отдельный класс для 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();
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Столкнулась с проблемой что нельзя одновременно у одного request вызвать и getReader(), и getInputStream(), в документации написано что нельзя и на практике...
Как считать xml-файл полностью в String, оставляя пробелы,но удаляя переносы строк?
подскажите пожалуйста как решить данную проблему, в интернете решения не помоглиВывод консоли при тестировании:
Пишу приложение на Android Studio конвертер валют, но столкнулся с проблемойПриложение вылетает при нажатии на кнопку "рассчитать"