2013-06-07 17 views
20

Làm thế nào tôi có thể tạo một mảng json giống như ví dụ bên dưới bằng cách sử dụng jackson.Tạo đối tượng json bằng cách sử dụng jackson

Tôi đã thử sử dụng ObjectMapper, nhưng điều này có vẻ không chính xác.

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

Cuối cùng, tôi sẽ tạo một json có các giá trị dưới đây.

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

Dưới đây là một ví dụ mà tôi đã được cung cấp.

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

Đặt ra json sau đó là gần gũi hơn, nhưng tôi không thể hiểu tại sao có dấu ngoặc kép phụ trước và sau khi {}.

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

cuối cùng trả lời

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

Câu hỏi của bạn dường như thiếu một câu hỏi thực tế. – Aurand

+0

Xin lỗi, với rất nhiều vấn đề về internet mà tôi đang gặp phải tối nay tôi nghĩ tôi đã quên thêm điều đó. : P Bây giờ nó có ý nghĩa hơn không? – zmanc

+0

Tôi khá bối rối. Không có sử dụng rõ ràng của 'ObjectMapper' ở đây. Bạn đang cố gắng để chuyển đổi một cái gì đó để sử dụng 'ObjectMapper' hoặc những gì? –

Trả lời

40

Bạn cần một JsonNodeFactory:

final JsonNodeFactory factory = JsonNodeFactory.instance; 

Lớp này có phương pháp để tạo ra ArrayNode s, ObjectNode s, IntNode s, DecimalNode s, TextNode s và không có điều gì. ArrayNode s và ObjectNode s có phương pháp đột biến tiện lợi để thêm trực tiếp hầu hết các giá trị nguyên thủy JSON (không chứa) mà không cần phải đi qua nhà máy (tốt, nội bộ, họ tham khảo nhà máy này, đó là lý do tại sao).

Với số ObjectMapper, hãy lưu ý rằng cả hai là bộ nối tiếp (ObjectWriter) và bộ giải tuần tự (ObjectReader).

+0

Trên thực tế sẽ bump này là câu trả lời kể từ khi câu trả lời khác gây ra vấn đề unforseen khi tôi đã cho nó tín dụng. Đây là câu trả lời cuối cùng mà tôi đã sử dụng :) – zmanc

9

Bạn có thể viết một đối tượng vào một chuỗi json. Vì vậy, tôi hy vọng bạn có dữ liệu của bạn trong một đối tượng của một lớp học được xác định theo nhu cầu của bạn. Dưới đây là cách bạn có thể chuyển đổi đối tượng đó thành chuỗi json:

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

String jsonString = mapper.writeValueAsString(yourObject); 

Xem here cho javadoc jackson-databind đầy đủ.

+0

Điều này đã cho tôi khá gần, nhưng vì một lý do nào đó tôi có thêm dấu ngoặc kép xung quanh các đối tượng con. Tôi đã thêm những gì tôi hiện có ở trên. – zmanc

+0

Bạn có thể cho chúng tôi biết cách bạn đang sử dụng ObjectMapper không? –

+0

@DirkLachowski Yep :) Tôi đặt nó ở cuối mô tả theo EDIT 1 – zmanc

8

Bạn có thể thực hiện việc này mà không cần tạo POJO và chuyển đổi nó thành JSON. Tôi giả sử dữ liệu của bạn trong đối tượng 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); 
4

khởi tạo đối tượng JSON như dụ singleton, và xây dựng nó:

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

PS: để println sử dụng node.toString().