2013-06-07 7 views
20

का उपयोग कर एक जेसन ऑब्जेक्ट बनाना, मैं जैक्सन का उपयोग करके नीचे दिए गए उदाहरण की तरह एक जेसन सरणी कैसे बना सकता हूं।जैक्सन

मैंने ऑब्जेक्टमैपर का उपयोग करने की कोशिश की, लेकिन यह सही प्रतीत नहीं होता है।

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

आखिरकार मैं एक जेसन बनाउंगा जिसमें निम्न मान हैं।

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

यहां एक उदाहरण जेसन प्रदान किया गया था।

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

निम्नलिखित 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\"}"]} 

अंतिम उत्तर

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

आपका प्रश्न एक वास्तविक प्रश्न अनुपलब्ध प्रतीत होता है। – Aurand

+0

क्षमा करें, इंटरनेट मुद्दों के साथ-साथ मुझे आज रात भी लगता है कि मुझे लगता है कि मैं इसे जोड़ना भूल गया। : पी क्या अब और अधिक समझ में आता है? – zmanc

+0

मैं बहुत उलझन में हूँ। यहां 'ऑब्जेक्टमैपर' का कोई स्पष्ट उपयोग नहीं है। क्या आप 'ऑब्जेक्टमैपर' या क्या उपयोग करने के लिए कुछ परिवर्तित करने की कोशिश कर रहे हैं? –

उत्तर

40

आप की जरूरत है एक JsonNodeFactory:

final JsonNodeFactory factory = JsonNodeFactory.instance; 

इस वर्ग ArrayNode रों, ObjectNode रों, IntNode रों, DecimalNode रों, TextNode रों और whatnot बनाने के लिए तरीकों है। ArrayNode एस और ObjectNode एस में कारखाने के माध्यम से सीधे बिना किसी JSON आदिम (गैर कंटेनर) मान जोड़ने के लिए सुविधाजनक उत्परिवर्तन विधियां हैं (अच्छी तरह से, आंतरिक रूप से, वे इस कारखाने का संदर्भ देते हैं, यही कारण है)।

ObjectMapper के रूप में, ध्यान दें कि यह एक धारावाहिक (ObjectWriter) और deserializer (ObjectReader) दोनों है।

+0

असल में जवाब देने के लिए इसे टक्कर मारने के बाद से दूसरे जवाब ने मुझे क्रेडिट देने के बाद असुरक्षित मुद्दों का कारण बना दिया। यह अंतिम जवाब है जिसका मैंने उपयोग किया :) – zmanc

9

आप एक json स्ट्रिंग के लिए एक वस्तु लिख सकते हैं। तो मुझे उम्मीद है कि आपकी आवश्यकता के अनुसार परिभाषित कक्षा के किसी ऑब्जेक्ट में आपका डेटा होगा। यहाँ कैसे आप एक json स्ट्रिंग में उस वस्तु में बदल सकते हैं है:

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

String jsonString = mapper.writeValueAsString(yourObject); 

पूर्ण जैक्सन-DataBind जावाडोक के लिए here देखें।

+0

यह मुझे बहुत करीब मिला, लेकिन किसी कारण से मेरे पास बच्चे की वस्तुओं के चारों ओर अतिरिक्त उद्धरण हैं। मैंने जो जोड़ा है वह मैंने ऊपर दिया है। – zmanc

+0

क्या आप हमें दिखा सकते हैं कि आप ऑब्जेक्टमैपर का उपयोग कैसे कर रहे हैं? –

+0

@DirkLachowski Yep :) मैंने इसे EDIT 1 – zmanc

8

आप POJO बनाने और इसे JSON में परिवर्तित किए बिना ऐसा कर सकते हैं। मैं रिकॉर्ड ऑब्जेक्ट में अपना डेटा मानता हूं।

 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

सिंगलटन उदाहरण के रूप में JSON ऑब्जेक्ट को प्रारंभ करने, और यह निर्माण:

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

पुनश्च: उपयोग node.toString() println करने के लिए।