2013-06-07 38 views
20

Wie kann ich ein JSON-Array wie im folgenden Beispiel mit Jackson erstellen.Erstellen eines Json-Objekts mit Hilfe von Jackson

Ich versuchte mit ObjectMapper, aber das scheint nicht richtig.

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

Schließlich werde ich einen JSON machen, der die folgenden Werte hat.

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

Hier ist ein Beispiel JSON, das ich zur Verfügung gestellt wurde.

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

die folgende json Versetzt aus, die näher ist, aber ich kann, warum die zusätzlichen Anführungszeichen, bevor sie nicht herausfinden und nach dem {}.

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

abschließende Antwort

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

Ihre Frage scheint eine tatsächliche Frage zu fehlen. – Aurand

+0

Sorry, mit der Fülle an Internet-Problemen, die ich heute Abend habe, glaube ich, habe ich vergessen, das hinzuzufügen. : P Macht es jetzt mehr Sinn? – zmanc

+0

Ich bin ziemlich verwirrt. Es gibt keine offensichtliche Verwendung von "ObjectMapper" hier. Versuchen Sie etwas zu konvertieren, um 'ObjectMapper' zu verwenden oder was? –

Antwort

40

Sie benötigen ein JsonNodeFactory:

final JsonNodeFactory factory = JsonNodeFactory.instance; 

Diese Klasse hat Methoden ArrayNode s, ObjectNode s, IntNode s, DecimalNode s, TextNode s und so weiter zu erstellen. ArrayNode s und ObjectNode s haben Convenience-Mutationsmethoden, um direkt die meisten JSON-Primitivwerte (ohne Container) hinzuzufügen, ohne die Fabrik durchlaufen zu müssen (naja, intern beziehen sie sich auf diese Fabrik, deshalb).

Beachten Sie, dass es sich bei einem ObjectMapper um einen Serializer (ObjectWriter) und Deserializer (ObjectReader) handelt.

+0

Wirklich gehen, um dies zu sein, um die Antwort zu sein, da die andere Antwort unvorhergesehene Probleme verursachte, als ich es Kredit gab. Dies ist die endgültige Antwort, die ich verwendet habe :) – zmanc

9

Sie können ein Objekt in einen JSON-String schreiben. Ich hoffe also, dass Sie Ihre Daten in einem Objekt einer Klasse haben, die nach Ihren Bedürfnissen definiert ist. Hier ist, wie Sie das Objekt in einen JSON-String umwandeln kann:

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

String jsonString = mapper.writeValueAsString(yourObject); 

Siehe here für die volle jackson-databind javadoc.

+0

Das hat mich ziemlich nah gebracht, aber aus irgendeinem Grund habe ich zusätzliche Zitate um die Child-Objekte. Ich habe hinzugefügt, was ich gerade oben habe. – zmanc

+0

Können Sie uns bitte zeigen, wie Sie den ObjectMapper benutzen? –

+0

@DirkLachowski Yep :) Ich lege es am Ende der Beschreibung unter der EDIT 1 – zmanc

8

Sie können dies tun, ohne POJO zu erstellen und es in JSON zu konvertieren. Ich nehme Ihre Daten im Record-Objekt an.

 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

Initialisierung JSON Objekt als Singleton-Instanz, und es baut:

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

PS: node.toString() Verwendung nach println.

Verwandte Themen