Comment puis-je créer un tableau json comme l'exemple ci-dessous en utilisant jackson.
J'ai essayé d'utiliser ObjectMapper, mais cela ne semble pas correct.
try (DirectoryStream<Path> ds = Files.newDirectoryStream(path)) {
for (Path file : ds) {
System.out.println("name:"+file.getFileName()+
"\n"+
"mime:"+Files.probeContentType(file)+
"\n"+
"locked:"+!Files.isWritable(file));
}
} catch (IOException e) {
System.err.println(e);
}
Finalement, je ferai un json qui a les valeurs ci-dessous.
* - (int) size file size in b. required
* - (int) ts file modification time in unix time. required
* - (string) mime mimetype. required for folders, others - optionally
* - (bool) read read permissions. required
* - (bool) write write permissions. required
* - (bool) locked is object locked. optionally
* - (bool) hidden is object hidden. optionally
* - (string) alias for symlinks - link target path relative to root path. optionally
* - (string) target for symlinks - link target path. optionally
Voici un exemple json qui m'a été fourni.
"files": [
{
"mime": "directory",
"ts": 1334071677,
"read": 1,
"write": 0,
"size": 0,
"hash": "l1_Lw",
"volumeid": "l1_",
"name": "Demo",
"locked": 1,
"dirs": 1
},
{
"mime": "directory",
"ts": 1334071677,
"read": 1,
"write": 0,
"size": 0,
"hash": "l1_Lw",
"volumeid": "l1_",
"name": "Demo",
"locked": 1,
"dirs": 1
},
{
"mime": "directory",
"ts": 1340114567,
"read": 0,
"write": 0,
"size": 0,
"hash": "l1_QmFja3Vw",
"name": "Backup",
"phash": "l1_Lw",
"locked": 1
},
{
"mime": "directory",
"ts": 1310252178,
"read": 1,
"write": 0,
"size": 0,
"hash": "l1_SW1hZ2Vz",
"name": "Images",
"phash": "l1_Lw",
"locked": 1
},
{
"mime": "application\/x-genesis-rom",
"ts": 1310347586,
"read": 1,
"write": 0,
"size": 3683,
"hash": "l1_UkVBRE1FLm1k",
"name": "README.md",
"phash": "l1_Lw",
"locked": 1
}
]
EDIT 1
Map<String, Object> filesMap = new HashMap<>();
List<Object> files = new ArrayList<Object>();
System.out.println("\nNo filter applied:");
try (DirectoryStream<Path> ds = Files.newDirectoryStream(path)) {
for (Path file : ds) {
Map<String, Object> fileInfo = new HashMap<>();
fileInfo.put("name", file.getFileName().toString());
// Prints Files in Director
// Files.getAttribute(file,"size");
System.out.println("name:" + file.getFileName().toString() +
"\n" +
"mime:" + Files.probeContentType(file) +
"\n" +
"locked:" + !Files.isWritable(file));
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(fileInfo);
files.add(json);
}
} catch (IOException e) {
System.err.println(e);
}
files.toArray();
filesMap.put("files", files);
ObjectMapper mapper = new ObjectMapper();
String jsonString;
try {
jsonString = mapper.writeValueAsString(filesMap);
} catch (IOException e) {
jsonString = "fail"; //To change body of catch statement use File | Settings | File Templates.
}
Met le json suivant qui est plus proche, mais je ne peux pas comprendre pourquoi les guillemets supplémentaires avant et après le {}.
{"files":["{\"name\":\"32C92124-EFCF-42C1-AFD2-8B741AE6854B.jpg\"}","{\"name\":\"58D5B83F-4065-4D6E-92BE-8181D99CB6CB.jpg\"}","{\"name\":\"7B1464A0-FBA1-429E-8A39-3DE5B539FBF8.jpg\"}","{\"name\":\"888159CF-45BE-475F-8C6A-64B3E1D97278.jpg\"}"]}
Réponse finale
Map<String, Object> filesMap = new HashMap<>();
List<Object> files = new ArrayList<Object>();
System.out.println("\nNo filter applied:");
try (DirectoryStream<Path> ds = Files.newDirectoryStream(path)) {
for (Path file : ds) {
Map<String, Object> fileInfo = new HashMap<>();
fileInfo.put("name", file.getFileName().toString());
System.out.println("name:" + file.getFileName().toString() +
"\n" +
"mime:" + Files.probeContentType(file) +
"\n" +
"locked:" + !Files.isWritable(file));
files.add(fileInfo);
}
} catch (IOException e) {
System.err.println(e);
}
files.toArray();
filesMap.put("files", files);
ObjectMapper mapper = new ObjectMapper();
String jsonString;
try {
jsonString = mapper.writeValueAsString(filesMap);
} catch (IOException e) {
jsonString = "fail";
}
Vous avez besoin d'un JsonNodeFactory
:
final JsonNodeFactory factory = JsonNodeFactory.instance;
Cette classe a des méthodes pour créer ArrayNode
s, ObjectNode
s, IntNode
s, DecimalNode
s, TextNode
s et ainsi de suite. ArrayNode
s et ObjectNode
s ont des méthodes de mutation pratiques pour ajouter directement la plupart des valeurs primitives JSON (sans conteneur) sans avoir à passer par l'usine (enfin, en interne, elles font référence à cette usine, c'est pourquoi).
Quant à un ObjectMapper
, notez qu'il s'agit à la fois d'un sérialiseur (ObjectWriter
) et d'un désérialiseur (ObjectReader
).
Vous pouvez écrire un objet dans une chaîne json. J'espère donc que vous avez vos données dans un objet d'une classe définie selon vos besoins. Voici comment convertir cet objet en chaîne json:
//1. Convert Java object to JSON format
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(yourObject);
Voir ici pour le javadoc jackson-databind complet.
Vous pouvez le faire sans créer POJO et le convertir en JSON. J'assume vos données dans l'objet Record.
JsonNode rootNode = mapper.createObjectNode();
ArrayNode childNodes = mapper.createArrayNode();
for (Record record : records) {
JsonNode element = mapper.createObjectNode();
((ObjectNode) element).put("mime": record.getDirectory());
//fill rest of fields which are needed similar to this.
//Also here record.getDirectory() method will should return "directory"
//according to your json file.
childNodes.add(element);
}
((ObjectNode) rootNode).put("files", childNodes);
initialiser l'objet JSON en tant qu'instance singleton et le construire:
ObjectNode node = JsonNodeFactory.instance.objectNode(); // initializing
node.put("x", x); // building
PS: pour imprimer, utilisez node.toString()
.