Добрый день подскажите как сериализовать в 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
public String nameDirectory;
public String toJsonString(){
JSONObject JSobj = new JSONObject(pool);
JSobj.toJSONString();
}
}
public class File {
String PathFile;
ArrayList
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
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
class SomeFiles {
private String name;
private Map
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
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
} ]
}
}
}
Комментариев нет:
Отправить комментарий