zma*_*anc 31 java json hashmap jackson
如何使用jackson创建类似于下面示例的json数组.
我尝试使用ObjectMapper,但这似乎不正确.
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);
}
Run Code Online (Sandbox Code Playgroud)
最终我将制作一个具有以下值的json.
* - (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
Run Code Online (Sandbox Code Playgroud)
这是我提供的json示例.
"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
}
]
Run Code Online (Sandbox Code Playgroud)
编辑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.
}
Run Code Online (Sandbox Code Playgroud)
提出以下更接近的json,但我无法弄清楚为什么{}之前和之后的额外引号.
{"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\"}"]}
Run Code Online (Sandbox Code Playgroud)
最终答案
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";
}
Run Code Online (Sandbox Code Playgroud)
fge*_*fge 49
你需要一个JsonNodeFactory:
final JsonNodeFactory factory = JsonNodeFactory.instance;
Run Code Online (Sandbox Code Playgroud)
这个类有创建ArrayNodes,ObjectNodes,IntNodes,DecimalNodes,TextNodes等的方法.ArrayNodes和ObjectNodes有方便的变异方法,可以直接添加大多数JSON原语(非容器)值,而无需经过工厂(在内部,他们引用这个工厂,这就是原因).
至于a ObjectMapper,请注意它既是序列化器(ObjectWriter)又是反序列化器(ObjectReader).
Jun*_*san 14
您可以将对象写入json字符串.因此,我希望您将数据放在根据您的需要定义的类的对象中.以下是如何将该对象转换为json字符串:
//1. Convert Java object to JSON format
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(yourObject);
Run Code Online (Sandbox Code Playgroud)
见这里为全杰克逊数据绑定的javadoc.
GPr*_*hap 10
您可以在不创建POJO并将其转换为JSON的情况下执行此操作.我假设您的数据在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);
Run Code Online (Sandbox Code Playgroud)
Pet*_*uss 10
将JSON对象初始化为单例实例,并构建它:
ObjectNode node = JsonNodeFactory.instance.objectNode(); // initializing
node.put("x", x); // building
Run Code Online (Sandbox Code Playgroud)
PS:要打印使用node.toString().
| 归档时间: |
|
| 查看次数: |
83459 次 |
| 最近记录: |