Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a json object using jackson

How can I create a json array like the example below using jackson.

I tried using ObjectMapper, but this does not seem 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);         } 

Eventually I will be making a json that has the below values.

 * - (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 

Here is an example json I was provided.

"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.         } 

Puts out the following json which is closer, but I can't figure out why the extra quotes before and after the {}.

{"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\"}"]} 

Final Answer

    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";      } 
like image 652
zmanc Avatar asked Jun 07 '13 00:06

zmanc


People also ask

How does Jackson convert object to JSON?

Converting Java object to JSON In it, create an object of the POJO class, set required values to it using the setter methods. Instantiate the ObjectMapper class. Invoke the writeValueAsString() method by passing the above created POJO object. Retrieve and print the obtained JSON.

How Jackson JSON works?

The Jackson ObjectMapper can parse JSON from a string, stream or file, and create a Java object or object graph representing the parsed JSON. Parsing JSON into Java objects is also referred to as to deserialize Java objects from JSON. The Jackson ObjectMapper can also create JSON from Java objects.


1 Answers

You need a JsonNodeFactory:

final JsonNodeFactory factory = JsonNodeFactory.instance; 

This class has methods to create ArrayNodes, ObjectNodes, IntNodes, DecimalNodes, TextNodes and whatnot. ArrayNodes and ObjectNodes have convenience mutation methods for adding directly most JSON primitive (non container) values without having to go through the factory (well, internally, they reference this factory, that is why).

As to an ObjectMapper, note that it is both a serializer (ObjectWriter) and deserializer (ObjectReader).

like image 158
fge Avatar answered Oct 13 '22 11:10

fge