Creating a json object using jackson(使用杰克逊创建一个 json 对象)
问题描述
如何使用 jackson 创建一个 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;
该类具有创建ArrayNode
s、ObjectNode
s、IntNode
s、DecimalNode
s、TextNode
之类的.ArrayNode
s 和 ObjectNode
s 具有方便的突变方法,可以直接添加大多数 JSON 原始(非容器)值,而无需通过工厂(嗯,在内部,它们引用了这个工厂),这就是为什么).
This class has methods to create ArrayNode
s, ObjectNode
s, IntNode
s, DecimalNode
s, TextNode
s and whatnot. ArrayNode
s and ObjectNode
s 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
).
这篇关于使用杰克逊创建一个 json 对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用杰克逊创建一个 json 对象
基础教程推荐
- 降序排序:Java Map 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01