Creating a json object using jackson

96,324

Solution 1

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).

Solution 2

You can write an object to a json string. So I hope you have your data in an object of a class defined as per your need. Here is how you can convert that object into a json string:

//1. Convert Java object to JSON format
ObjectMapper mapper = new ObjectMapper();

String jsonString = mapper.writeValueAsString(yourObject);

See here for the full jackson-databind javadoc.

Solution 3

initializing JSON object as singleton instance, and building it:

ObjectNode node = JsonNodeFactory.instance.objectNode(); // initializing
node.put("x", x); // building

PS: to println use node.toString().

Solution 4

You can do this without creating POJO and converting it into JSON. I assume your data in the Record object.

        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);
Share:
96,324
zmanc
Author by

zmanc

Updated on July 13, 2020

Comments

  • zmanc
    zmanc almost 4 years

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