Страницы

Поиск по вопросам

четверг, 18 апреля 2019 г.

Сериализация сложного JAVA объекта в JSON

Добрый день подскажите как сериализовать в JSON объект Files? Используя метод toJsonString сериализуются только поле nameDirectory, а поле pool выводится в виде хеша?
import org.json.simple.JSONValue; import org.json.simple.JSONArray; import org.json.simple.JSONObject;
public class Files {
public Map pool;
public String nameDirectory;
public String toJsonString(){ JSONObject JSobj = new JSONObject(pool); JSobj.toJSONString(); } }
public class File { String PathFile; ArrayList Records; boolean PutInEnd; }
public class Record {
private String recordname; private String status; private int countExecution; }


Ответ

Для таких целей есть специальные библиотеки - Jackson и Gson
import java.io.File; import java.io.IOException; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap;
import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.JsonMappingException;
class Record { // Поле name и так находится в Record, // называть его recordname - это лишнее private String name; private String status; private int executionCount;
public Record() {}
public Record(String name, String status, int executionCount) { setName(name); setStatus(status); setExecutionCount(executionCount); }
public void setName(String name) { this.name = name; }
public String getName() { return name; }
public void setStatus(String status) { this.status = status; }
public String getStatus() { return status; }
public void setExecutionCount(int executionCount) { this.executionCount = executionCount; }
public int getExecutionCount() { return executionCount; } }
// Плохая идея использовать имена классов // входящих в стандартную библиотеку class SomeFile { private String path; // Имена полей должны начинаться со строчной буквы private List records; private boolean putInEnd;
public SomeFile() { records = new ArrayList<>(); }
public SomeFile(String path, boolean putInEnd) { this(); setPath(path); setPutInEnd(putInEnd); }
public void setPath(String path) { this.path = path; }
public String getPath() { return path; }
public void setPutInEnd(boolean putInEnd) { this.putInEnd = putInEnd; }
public void addRecord(Record record) { records.add(record); }
public List getRecords() { return records; } }
class SomeFiles { private String name; private Map pool;
public SomeFiles() { pool = new HashMap<>(); }
public SomeFiles(String name) { this(); setName(name); }
public void setName(String name) { this.name = name; }
public String getName() { return name; }
public void putSomeFile(String name, SomeFile someFile) { pool.put(name, someFile); }
public Map getPool() { return pool; } }
public class App { public static void main(String[] args) { SomeFile f = new SomeFile("/root/secret.txt", false); f.addRecord(new Record("Some Record", "Some status", 42)); f.addRecord(new Record("Another Record", "Same status", 0));
SomeFiles sf = new SomeFiles("Some Files"); sf.putSomeFile("Some File", f);
ObjectMapper mapper = new ObjectMapper(); // Для вывода с отступами mapper.enable(SerializationFeature.INDENT_OUTPUT);
try { // Здесь происходит самая главная магия mapper.writeValue(new File("some_files.json"), sf); } catch(JsonGenerationException exc) { exc.printStackTrace(); } catch(JsonMappingException exc) { exc.printStackTrace(); } catch(IOException exc) { exc.printStackTrace(); } } }
Получится такое:
{ "name" : "Some Files", "pool" : { "Some File" : { "path" : "/root/secret.txt", "records" : [ { "name" : "Some Record", "status" : "Some status", "executionCount" : 42 }, { "name" : "Another Record", "status" : "Same status", "executionCount" : 0 } ] } } }

Комментариев нет:

Отправить комментарий