使用 jackson 创建一个 json 对象 [英] Creating a json object using jackson

查看:22
本文介绍了使用 jackson 创建一个 json 对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我如何使用 jackson.js 创建如下例所示的 json 数组.

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

我尝试使用 ObjectMapper,但这似乎不正确.

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()+
                        "
"+
                        "mime:"+Files.probeContentType(file)+
                "
"+
                "locked:"+!Files.isWritable(file));
            }
        } catch (IOException e) {
            System.err.println(e);
        }

最终我将制作一个具有以下值的 json.

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

这是我提供的示例 json.

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
    }
]

编辑 1

        Map<String, Object> filesMap = new HashMap<>();
        List<Object> files = new ArrayList<Object>();
        System.out.println("
No 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() +
                        "
" +
                        "mime:" + Files.probeContentType(file) +
                        "
" +
                        "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.
        }

放出以下更接近的 json,但我不明白为什么 {} 前后有额外的引号.

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

最终答案

    Map<String, Object> filesMap = new HashMap<>();
    List<Object> files = new ArrayList<Object>();
    System.out.println("
No 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() +
                    "
" +
                    "mime:" + Files.probeContentType(file) +
                    "
" +
                    "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"; 
    }

推荐答案

你需要一个 JsonNodeFactory:

You need a JsonNodeFactory:

final JsonNodeFactory factory = JsonNodeFactory.instance;

这个类有创建ArrayNodes、ObjectNodes、IntNodes、DecimalNodes、TextNodes 等等.ArrayNodes 和 ObjectNodes 有方便的变异方法,可以直接添加大多数 JSON 原语(非容器)值,而无需经过工厂(嗯,在内部,它们引用这个工厂,这就是为什么).

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

对于ObjectMapper,注意它既是序列化器(ObjectWriter)又是反序列化器(ObjectReader).

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

这篇关于使用 jackson 创建一个 json 对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆